APIO&THUSC2019游记

连在一起写了

Posted by wyj on May 16, 2019

作为最弱的蒟蒻,我没有CTS的资格,身边的大佬们却都能拿到Au,我和他们的差距实在太大了。

Day0

一早赶到火车站,只参加APIO的人太少了。到了北京乘地铁,我居然还记得乘什么线多少站以及沿途的站名。在四号线上看见我大Ubuntu,以及熟悉的system error。这才知道原来ubuntu其实是个挺常见的系统。

下了地铁,故地重游感慨良多,可惜这次不再住裕隆国际酒店了,因为水平太差被扔到一个垃圾酒店,办个入住都要等半个多小时,房间里充满了异味。

下午试机因为sff咕了,我也干脆咕了。发现去吃完饭要走好远,挺累的。学校里正是放学时间,看见各种穿着五颜六色丑陋校服的人。不过平心而论比广二的稍微好一些。回到宾馆发现还是没有人?也许今天我可以一个人享受双人间了。我很早就睡了(十点不到)。

Day1

早上被某一巨大声响吵醒,我以为是自己的闹钟,然后看了下手机,蒙眬的睡眼似乎看见都6点30分了,于是赶紧开灯爬起来。然后再去看手机,我靠,是4点30分。于是继续睡。

到了6点35分我就被真正的闹钟闹醒了。然后去吃早饭,幸亏我看了前人的游记,记得带上指甲刀。吃早饭时看见了xyx和snz两个无敌的人。

然后去讲课的大厅,只看见lzq。讲课的内容是内存的一些底层细节和各种把page送进送出的算法。我没听多久就掉线了。无法重连。于是开始看知乎。snz很好奇为什么我要把首页上面几乎所有的文章标成不感兴趣。

吃饭时在地下的餐厅中听见食堂大爷说“请往西走”,然而我不认得东西南北。因为下午两点才开始,我就先回宾馆爽。

两点去听课,某北大讲师一本正经的讲如何01背包。于是半场人都走了。我去snz的房间,本来是为了给snz演示一下如何直连wiki、p站装个b,一切都很成功,就是开机自启一直失败。神仙们则一直在颓废。snz让我想了想CTS D1T1,然而我只会30暴力。

去学校吃晚饭。吃完晚饭我继续尝试开机自启,直到晚上7点多的时候我终于成功了。然后我就非常困,知乎都懒得看,一直闭目养神。十点睡觉。翻来覆去睡不着,热得要命,于是把空调从25℃改成23℃。

Day2

早上晚起了十分钟。吃完饭去找吴老师要密码条,我在操场上打了他几通电话都不接,于是我打算回到地下的餐厅找snz。正在我往地下走的时候他打给了我,我差一点就接不到了。

9点才开始,在考试之前围观lzq和zc斗地主。AK王snz一直在诈骗说他要爆零,并且不肯押题。我猜今年的考试肯定不会再是数据结构专场了吧。

进了考场,我登录的时候作死选择了ubuntu,这下好,整个桌面都没了。我废了九牛二虎之力打开一个终端,才想起来reboot要root权限。于是举手求助。工作人员进了tty,登录管理员账号,然后sudo reboot。我看着他输了两次密码,看键位像是”cts2019sb”之类的,然而我自己输就猜不对。获取root权限的梦想破灭了。

看题,第一题就散发着DS的清香,乍一看这东西严格难于动态图啊,于是我觉得不可做开始看T2。T2是个数学题,我一点思路都没有。然后是T3,怎么又是DS,而且我觉得这题和T1没啥区别。然后我开始想所有我会做的部分分,过了90min我发现自己大概只会做123,这不是凉了,肯定没有Au。

我从T2的\(b\le 3\)部分分做起,我觉得这个10分就不是人写的了,到处都是+1,-1,还要各种特判。当时我真的没看出来这东西有循环节,于是我就枚举模b的余数,再循环\((b+1)\)次,每次跳一个奇怪的步长,这样就能够把\(t\bmod a\bmod (b+1)\)的所有值遍历到,再把两头特判一下,然后做\(O(b^2)\)个区间覆盖即可。这东西真的难写,还好我一遍写对了,要不然我是真的完蛋了。

然后我飞速码完前10分,开始T1。我想,可以权值分块,每块维护一个动态图。可惜这东西真的只能想想。连树(只需要维护lct)都不可能有分。于是开始飞速码暴力。其中一条链的我码了两个log的线段树外二分。

我觉得我的并查集从来没有一遍写对过,以前snz还给我纠过一些错。于是我写了如下的代码,还死活看不出错在哪里

fa[fa[E.x]]=fa[E.y],siz[fa[E.y]]+=siz[fa[E.x]];

最后开始T3,我先码了前20,再是第三个20(因为这可以复用我的T1代码,比维护历史版本和的数组好写),然后是第二个20。码完之后得到了我梦想中的123,这时还有一个小时,我打算混吃等死。

幸亏那个“维护历史版本和的数组”是我的最后一份代码,我懒得把gedit关掉。然后对着代码,忽然灵感就来了,我发现,把一维数组换成二维,不就直接AC了吗。于是开始kd-tree,我从来没有写过要打tag的kd-tree,所以果然写错了。另外一部分是找之前之后相邻的0,我被这个灵感冲昏了头,本来一个set就可以的事,我居然写了个两个log的线段树外二分。没错,我又一次复用了T1的代码。样例随便过,交上去爆零。

这时已经13:40了,我相当虚。开始写gen,而暴力是现成的。一拍就错。调试了整整20分钟,我终于发现了错误:kd-tree不是线段树,我忘了把非叶节点的值也算上去了。这个错我已经犯过不知道多少次了。

交题一直失败,很生气。我干脆把firefox关了重开,终于可以交题了。好不容易AC了一道题,我想或许Au还是有希望的吧。

然后是已经老掉牙了的剧情,出考场,snz比我高100分。他说T1T2都是sb题,T3他懒得调试了。我刚刚好了一丁点的心态又彻底崩了。大众分200+,任何一个人都比我高。我真的绝望了,T2那么sb的题,我居然一点也不会。

讲题直接咕掉,因为snz认为没有什么好听的了。

另外,在F11的位置居然是Sleep键,虽然snz提醒过我,我还是关了不知道几十次电脑

晚饭时忘了三小时前才吃的中饭,所以没吃下去什么。晚上继续困得要死。

Day3

早上反常的五点多就醒了。我不打算去学校吃早饭了,因为昨天考试时发的蛋糕还没吃。直接去听讲课,这次还是熟悉的吕紫剑讲光线追踪,几乎没有掉线,看到了很多牛逼的算法,然而我觉得没什么用,于是打开gnome-2048,选择\(5\times5\),人生第一次达到了16384。然后嫌25个格子太无聊就没有继续下去,直接关了。

中午在snz的房间里,本来打算完成前几天未尽的装b事业,然而装b继续失败,snz遇到了一些奇怪的问题,同样的程序,我跑的一切正常,snz却抛出了异常说不能把None转成str

下午的讲课是最正常的一次,讲了好多奇怪的\(O(n)\)算法,长剖之类的的确很有用,我还听懂了大半十二省联考D2T3的题解。然后是四毛子算法,我觉得真的没什么用。最后是例题,我彻底掉线,又因为没有信号,很无聊。然而lzq说是sb题。

晚上看颁奖,我猜snz国际金稳了,我肯定是没有Au的,我都AC一道题肯定有Ag。选择二楼,一方面是因为snz周围没有位置了,另一方面是因为二楼信号好得多,可以及时发布snz捧杯图。

按照惯例,首先宣布snz国际金,然后是Cu,一共11批。我这时觉得肚子极度不适去上厕所,希望能够在颁到自己之前回来。回来的时候已经第九批了,还是只有128分,我自我感觉良好。

到了第十批忽然急剧提高到了153分,这时慌得要命,祈祷自己压线Ag。然后崩溃了,发现自己是Cu Rk1。此处省略1W字心理活动。

Ag只有3批,Au却有8批,这是为什么?因为Au中的超过一半都是压线Au的203分。也就是暴力分。最后到了高潮:snz捧杯,大家纷纷拍照。我手机比较垃圾人脸都拍不清楚。只好发zc的照片了。

SNZ AK IOI

为什么A了T2就可以Au,然而A了更难的T3却只能炼铜,我百思不得其解。(snz:明明是三道SB题)我真的这一年一直在变菜,noip是,省选是,apio还是。

在去收获的路上 丢失了自己的行囊
在去寻找的路上 收获更多的绝望

luogu已经连续大凶三天了。

Days.next()

今天进行了搬迁。这次西郊宾馆的房间是真的小,可能只有之前的一半大。一直在颓废。

Days.next()

早上一直拉稀。到了十点多才起来,于是没有吃早饭。下午写了毒瘤的树上带修莫队,被hlh嘲讽。

晚上hlh妈妈带我们去吃烤肉。烤肉一块只有拇指大,一盘的鱿鱼可能几乎全部都是洋葱,真正能吃的也就是几片超好吃的生菜和土豆饼。这东西要423。

Days.next()

早上吃了78元的早餐,然而觉得和普通酒店没有什么区别。装了pypy,发现这个东西居然和python冲突,找不到解决方案,最后全部折腾坏了,只好卸载了pip。使用了~/.local/bin/pip。幸亏那个Accesser还能用,Shadowsocks还工作正常,ubuntu没有瘫痪。

然后写了exkmp题解,不知道为什么其他人都要那么长。下午就写了个CTS的D1T1,带log就过了。exgcd常数是真的小。

Days.next()

一直在颓废。随便写了个倍增ntt,居然一遍过样例,一遍AC。发现分治ntt在任何可以mod998244353的数据中都快于多项式exp

下午了解了一下校内的训练内容。发现snz成绩又达到了历史新高:我的15倍。他们居然碰巧也做到了倍增ntt,于是snz跟着我把那道题写了。人生第一次NTT比snz快!

晚上刷知乎的过程中忽然对《挪威的森林》产生了兴趣,就一个晚上看完了。

Day0

今天上午偶然学习了一下wine。下午就一直刷知乎,发现自己对于费用流复杂度的证明是伪证。然后就不会证也不会卡了。帮snz验题,验的T1,std是离线线性求逆和二项式反演,我相信这是snz眼中的普及组。

晚上又去吃饭。吃饭的过程中感慨良多:

do{
	if(!nxtContest() || !OI前景)退役=1;
	auto t=getContest();
	goto t.目的地();
	for(int i:range(t.days())){
		吃饭() && 讨论(OI前景);
		考试();
		if(self.score(now)>=self.score(lastYear))
			throw "Impossible";
		cerr<<"我越来越菜"<<endl;
		snz.吊锤(全场);
	}
	goto home;
	OI前景--;
}while(!退役);

Day1

上午去报到,试机,觉得16.04还是比我想象中舒服,除了Alt+Tab功能失常之外。居然找到了geany这个IDE,这是我昨天刚刚使用过的。

中午又是吃饭。无趣的吃饭。然后合影。无趣的合影。然后讲座。讲过一万遍的讲座。然后就咕咕咕。很困。

到达了机房,发现和试机座位正好挨着。然而区别有点大:键盘打字要用很大力气才能按下,并且两次敲击同一按键会只显示一次。我废了九牛二虎之力终于打出来一个for循环。本来打算举手要求换键盘,看见对面的老哥先举了,得到的回复竟然TM是“只要能按下去就不用换”,真想问候工作人员全家。

咕了整整40分钟之后开始比赛。我一看T1就不会做。看T2像是很可做的图论。T3像是不可做乱搞。但是我还是选择顺序开题。

这个T1真的像是不可做的数学题,我只会记录二维状态进行dp。于是我开始推式子,越推越自闭。推的中途,我发现了下降幂多项式也是可以二项式展开的,发现这道题本身就是一个绝妙的组合证明。于是我开始往二项式反演的思路走,进入了死胡同。最后实在不会,就只好使用垃圾键盘敲了一个裸dp,敲的手指都疼死了。模数还差点打成了998244353。

然后开T2,一开始我觉得越看越不可做,好像是多重覆盖,那么lzq是不是又要踩全场了?然后就想树。想着想着脑子糊涂了,以为要覆盖所有的最短路。忽然发现这是个sb网络流,于是开始dinic。码完之后,卧槽,怎么爆零了?原来是无向图啊,我以为是有向图。

然后自信满满的建成有向图,结果只过了前两个点。过了一会之后发现假了。然后就自闭了。

自闭了之后就想着骗分。我想了一个爆搜,然后发现这玩意可以记忆化。这不是完了,复杂度1个亿了。我抱着试试看的心态写了个spfa建最短路图然后bitset,结果还是只过了前两个点。本机测下来没有T啊,只有0.2s。

进入了第n次自闭。想了半天,各种魔改都不对。一个小时之后终于有了一点脑子,觉得可能是spfa的问题。我就换成了dij。尽管本机对拍下来没有区别,交上去就过了,WTF?

终于开始T3,有不少思路,最终发现我可以只用get_y,我可以通过随机三个加起来等于0的数来避开get_w。然后写了写,发现我需要知道w的位数。本来打算\(O(\log W)\)枚举,却发现我T了。lzq就只用做一次的随机,我10次还是爆零。我太菜了。最后我稍稍优化了一下,只询问有可能的Q,就可以随机500次了。我脑子不够健全,没有看见第三档部分分中,这个算法也可以拿分。于是我只枚举了Q,忘了get_Q,白白丢了10分。

写完T3之后就只有10分钟了,我又想了想T1,还是没有思路。最终得分\(23+100+34=157\)。

毕竟snz没来,这次心态就平衡多了,虽然还是垫底,但大家都只比我高50分左右。T1居然就是THUWC的T1的结论,气死我了,我不会什么就一直考我什么。

晚上吃了泡面。然后游记都只写了一半就睡觉了。

Day2

早上压根就起不来。8点之后起床惯了。早饭时了解到昨天T2还可以\(O(k\times2^k)\),可惜我没听懂,我只理解了\(O(k\log{k}\times2^k)\)的或卷积快速幂。

进入考场,又咕了半小时。居然不换座位,差评。开题,一看T1就是sb题,直接交。怎么爆零了?我肉眼查不出错,就只好对拍了。怎么拍不出错?原来是忘了srand。于是我在半个多小时之后,终于切掉了T1。

然后我开始想T2,发现一点思路都没有,观察了不少“性质”,可惜每一个都有反例。对着第三档部分分想了一个多小时,还是不会。弃疗,去看T3。这不是送了46分吗,然后\(r_i=0\)看起来也很简单,比T2可做多了。于是我开始思考\(r_i=0\)的细节,却发现这个好像判重有些困难。于是我就直接开始码前46分,码了半个多小时,居然一遍过样例,一遍过pretest。我心里其实很虚,然而不会对拍,只好扔着不管了。

然后惊奇的发现,满数据我只需要跑12s。我不禁开始YY暴力碾标算。卡常了一会,发现计算几何常数过大难以AC,于是放弃了。

这时还剩1.5h,我在T2的第三档部分分和T3的第三档部分分直接犹豫不定。最后我选择了T2。事后看来这是个正确的决定。

过了半小时我忽然就有了思路,觉得第三档部分分我会带log做法。写着写着发现,这个好像要带两个log。怎么办?最后我把主席树换成了memcpy版可持久化数组。然后发现我在智障地二分一个一次方程的零点,换成直接求解,成功不带log。结果发现这个好像没有用到第三档部分分的任何性质!我难道AC了?不,爆零了。

对拍小数据死活不出错,到了10才出错。调试半天之后震惊的发现:这是个从头假到尾的算法,从第一个猜想(题目要求的max是凸的)开始就全部不成立!陷入了绝望。真的白来THUSC了。

我别无办法,只能死马当活马医。和前一个求交点是错的,那我跟前缀的所有值取min就可以通过这个错误数据了。然后就从m变成了m^2。

结果还是爆零感叹号。为什么?我本来都打算弃疗了,后来觉得无聊就又调了调,发现我把前驱换成了前缀,求根公式却忘改了。修正求根公式之后,对拍居!然!过!了!真的乱搞出奇迹。

我交上去,获得了1、2、4三档部分分。然后就开始观察我的复杂度瓶颈,希望优化。

这个乱搞式子好像是一个斜率的形式?那是不是可以斜率优化?我当时脑子过于紧张,神经有些错乱,以为我每次要在凸包上三分一条切线,于是这带上一个常数超大的log,肯定是不行的。所以我写了个凸包就弃疗了。

最后五分钟,我希望第三档部分分有特殊性质。可惜我的猜想全部失败了。还有半分钟的时候,我终于恢复了一些神智,发现压根就不要三分,暴力扫描即可,因为扫到的点都被弹掉了,这个复杂度显然是均摊线性的!我想起来之前的还没删掉的凸包,改了改。可惜时间真的不够,就算snz附体也不能救我。

考试的时候一直梦想着AK的我,最后只有\(100+52+46=198\)。

出考场,lzq说他只需要一个半小时就可以吊锤我。然而为什么没人写T3暴力,这让我完全不能理解。

Day2+

下午睡了一觉。又是还没睡醒就被叫了起来。晚上又是Day2+,我自我感觉良好。

一看题,发现我100%押对了,就是网络,抓包之类的。因为我前几天试用了一下比WC多的那个WireShark,发现是个我完全不懂的网络应用。

首先是读写一个奇怪的封包格式,我大脑完全下线,犯了数不清的错误,最关键的一个错还是已经犯过无数次的:puts("\0\xA1\xB2");等我反应过来的时候给自己扇了一巴掌。

然后居然已经过了一个多小时,我心里很虚,觉得这次完全不在状态。开T2,就是要检测一下校验值。这居然是里外两层校验值套在一起。我懒癌发作,不想用一个char数组记下来,觉得边读边做方便。然后写着写着才发现,我选择了最难写的一条路。由于眼睛也快下线了,我很多的取反都没看到。于是再次调到自闭。关键是样例还特别水,压根就不能检查内层校验的正确性。只好开始对着Wireshark教程照猫画虎,却发现这东西对我来说没什么卵用。

经过了五六次的错误提交之后,我快把我的错误总结全部复现一遍了。这时我终于意识到了最根本的问题,文件输入输出没关。我本来抱着AC的梦想,结果无情的TLE。

为什么TLE?显然是我不应该用basic_string<int>代替boost::dynamic_bitset的功能。可惜没有boost,我发现标准的bitset好像难以支持这个操作。卡常失败。觉得整个人像是压根就没开机一样。

此时只有50分钟了。我下定决心开启T3。卧槽,MAC地址在哪里?找了半天发现,居然tmd在T1的题面里。真的坑人。然后接口又是什么?我没有在任何地方找到,只好把ARP请求里面的ip的第三段提出来当做接口。

我飞快的码了半天,到还剩十分钟的时候,终于把ARP协议码完了。此时我回到上层的以太网协议,发现最后有一个crc32!这回真的完了,除非重构代码,我不太可能支持这个操作。此时肠子都悔青了,早知道就把输入输出全部写在char数组里了。

我这次Day2+完全失常。还好别人也许比我更失常,或许还有救。

总结:WC和SC的Day2+内容几乎完全一样。下次应该可以整理一份模板,做到多快好省的造轮子。不能再想到什么写什么了。

Day3

早上去面试,这次居然是乱序的,导致我和lzq一起被很早抽到了。我觉得这次被面试官针对了,上来就问我NOIP成绩,然后问我超难的数学题。其实也不算很难,就是需要一些逆向思维,他要是反过来问我肯定会做。然而我当时就是没做出来。这时候已经知道自己凉透了。

回到宾馆,知道自己马上就要去文化课了。数着退役的倒计时,下午去听讲座,首先是题解,听完题解,我发现自己也许具有AK的能力?(这句话等价于snz考试时可以随手AK)可惜失误实在是太多了。

然后是老掉牙的清华自吹。咕了整整一个小时之后才颁奖,显然我这种蒟蒻是不可能有奖的。然而lzq就可以二等。我觉得一等真的太难了,除了snz之外几乎没有人具有一等的能力。

颁奖结束后去吃了兰州拉面。