CDQZ多校集训记


20171218 DAY0 初相逢

  今天的阳光很好,确实好极了。下午开始时,mercer说门外站了一堆人,我看都不用看就知道是衡水的。衡水人,怎么说呢,觉得还是挺不一样的。不知道像凡哥和超哥这种奇异的生物究竟是如何得以存在的……可以想到,他们的生活确实十分的简朴,一个年级可以被硬生生切成3块,A部B部C部鼓励无端竞争,每个部20个班,每个班80个人,一个年级就能有将近5000人之多。这简直是难以想象的,SRS说“高四”更可怕,为了方便竞争,直接把墙硬生生拆掉,一个班就有了170个人。

  他们才从会考的阴影中走出,NOIP之后的2周时间里,他们把3本历史3本地理都嚼得粉碎。想到自己只有8天,还是感到了一丝丝的后怕。此外,他们听说我们6:40起床的时候高兴极了,因为他们5:40起床,要求5:45整队……我立即问到,哪里来的洗漱时间?可以想见。于是他们继续了,他们21:50下自习,要求22:00熄灯,中间还有10分钟的自主学习时间。其实时间是相当的,但是如此卡时间真是难以置信。不过,基本的锻炼时间他们还是有的,虽然不上体育课,但还有晨跑,5分钟一顿的三餐之余也可以成立信息学竞赛足球队两支。

  怎么说呢?衡水的RYF, ZZH, WXH, ZYF......,黑龙江的Amphetamine,吉林的ZGZ, LKH, JCY, NKC......也都见到了。确实是很开心的。

20171219 DAY1

  上午肯定要考试的。

  T1先写暴力,果不其然又推知了正解矩阵乘法。这个方法,好像还比正解优。不过,题目还是坑了我20分下来。“若答案小于等于9位,输出答案,否则最后 9位”跟“%1e9输出”是完全不同的概念。前导0真是坑,衡水的RYF过了这道题,做法是打表……一共有三个人被这个坑了,分别是CDQZ的WJ、ZJC、GYK。

  T2看到就蒙了。虽然之后想到分开%p和%Phi(p)=p-1处理,却始终没有想到原根这一茬。但其实没有想到原根也能得很多分,主要还是懒……不过,原根似乎也会有一点小问题。就是说,必须要使得gm≠x(mod p),据说这叫什么“二次剩余”。

  T3是一道LCT,根到某个点就是access,但当时知道写不出来就写了O(dep)的暴力,理论上可以过40分,实际上数据水T了3个点。据说正解还需要找子树,使用树状数组……

  我今天80+20+70=170,WJ大佬80+100+0=180位居RANK 1。我觉得应该还是外地的各位大佬劳顿未休,再过几天,一个二个都该是要强炸天了。

  下午JCY讲课,讲LCT。ta为了说明LCT不是玄学,先在最前面细述了复杂度的证明手段,非常具体,我觉得这是很难能够听到的。讲的很好,虽然之后几乎全是说来轻描淡写实则码力十足的大坑题。最后,为了填充时间,还讲了FWT(不知道这两者有何关系),让我恍然大悟:原来“IDT”就是FWT。

  衡水的人表示很“不满”,说JCY完全不按日程讲。Hfu老师虽然曾经多次和我们讨论过讲课内容,但直到现在都没有把具体日程给我们,我们也是半蒙半蒙的。

20171220 DAY2

  上午还是照例考试的。看了T1和T2,觉得毫无思路,于是看T3。

  最开始并不完全确定题意,于是按照自己的想法写了个bruce过了样例,题意就算是明白了。bruce是统计每一个区间对应的巡游,然后一条链一条链的扒出来,发现并不能有什么优化,虽然最后CDQZ有一个高一的贡献了这样的优化方法(不过他因为爆int失了20分)。然后转变思路,考虑每一条边的贡献,没有经过它的区间就是上下分离的区间。照着这个样子想,就是n*(n+1)/2-∑k*(k+1)/2,k是子树中每个连续一段的长度。最开始想使用set却没有想到办法,于是辗转之后想到了线段树。自底向上,可以使用线段树合并。而如何快速的查询呢?只需要存前后缀连续一段的情况,与中间非前后缀的已有sigma就可以了。最后询问的时候需要加上前后缀的影响,而在合并时直接合并就是了。中间贯穿与不贯穿的情况很有趣,update最后居然写了25行之多。不过,因为这样的合并在每个叶子上是没有重复的,像是永无乡那样,可以证明最后合并的复杂度和一个一个插入的复杂度O(nlog n)是相当的。最后的复杂度就是O(nlog n)*O(update)了,这里专门把update列出来,还是因为它太长了。

  不过,我当时没有想通的set却让LKH想了出来。他们如此写,最后的复杂度就是O(nlog2n),毕竟set不是splay。

  WQ写O(n2)暴力,我觉得这也是很巧妙的。他枚举区间的每个起始点,然后考虑每条边的贡献,使用我的想法,就是求出子树中>该点的最小值。

  T1统计水平线段和竖直线段交点到4个端点距离最小值的最大值。暴力可以过,因为前50%1000后50%随机。但是,我可能剪枝不够优,没有卡满。正解是二分答案+扫描线,就是每条线段只保留合法交点的一截长度,于是只要有交点即可。之后,水平线段就可以当做区间查询,竖直线段在合适的时候加入,统计一段出头的是否足够长就可以了。

  T2是一道线性基,不会不会……

  下午和Amphetamine打乒乓打得很开心。

20171221 DAY3

  上午照例考试的。

  T1大水题,枚举A-B的因子就好了。但是失了5分,是因为没有判断A==B的情况。自己的分类讨论向来不是很优秀,还是要多加努力的。

  T2当时看见逆序对,看见n≤600,蓦然想到了三次方的行列式。但直到最后也没有写出来,是因为不确定方案统计的是匹配还是匹配下的路径。此外,“路径两两不相交”让人十分头疼。

  中间,ZJC进来问过一次问题。就是一个点如果既无出度亦无入度,应当算作两个。想来很显然,但有个人写了“else”只有80。而至于“路径两两不相交”怎么办呢?考虑到“路径两两不相交”=“路径可交”-“路径相交”,行列式算出的是“路径可交”,而“路径相交”的情况一定可以两两配对相加为0。所以根本不用考虑,确实非常非常妙。

  T3是一道回文树,询问一个回文串是已经给定串多少子串的后缀,不要求本质不同。因为不要求本质不同,所以不是统计fail树子树siz,而是统计fail树中下面结点到子树根的距离和。前80分是先修改后询问,所以统计可以放在最后。而后20分则不同。如果离线,则可以对操作数分块解决,更高效的可以树链剖分;如果在线,则可以使用LCT。

  但是,DSFZ的TXL觉得这样实在过于naive。他认为我们对回文树的了解过于浅薄,其实只靠回文树本身就可以了。当时花了很久来研究这个,其实是这样的。加入一个串后,答案有变化的节点一定是该串的回文子串节点。而一个串的,是用归纳法证明最长回文后缀才可能是新增的。把每个走到的节点last压入栈中,再使用一些数组存新增量即可。

  不过,JCY给出的卡法也是很优秀的。如果允许在一个串后再加一个串,那么JIJI就是必然的了。

  下午讲课。JCY的DS实在是太长了,我觉得如果能把这上面的所有题都做了,DS应该不会特别弱。实在是诚意之作啊。

  之后还是和Amphetamine打球,顺带带上了昆爷。特别爽快。

  今天,主要还是做了另一件事:总结数论体系。大概整个体系已经理出来了,自己在哪里掌握的很好,在哪些地方还很有欠缺,基本上都齐全了。

20171222 DAY4

  今天照例考试。

  T1看上去比较难以解决,但实际并不然。JCY说NKC本打算把这道题出成T3防AK,然而此题有十几人AC了。我的思路是模拟题目的过程,使用平衡树维护一个函数数组。查询直接查询,维护其实就只是删数。说来也可以算是DP优化。而YYF的做法是二分+树状数组,单点+tag,二分询问点,复杂度O(nlog2n),但代码好写。而WQ的做法是正着for,在加入第i个数的时候考虑第1~i-1个点的变化,即使用平衡树中间按信心值排序。

  ZJC说他读错了题,幸好最后发现,及时写了暴力,救回了50分。所以说,题目还是要谨慎理解的。如果连题意都看错了,一定是很艰难的。

  T2和T3都是数论,觉得自己数论的盲点确实还是有的。

  T2的题意:给您k个n-1维空间,问能够把一个n维空间分成几个部分。1维显然,2维显然,3维1个平面2个平面3个平面显然,然而在3维4个平面上长久的卡住了。表打不出来,推理也难的想了。

  这样的答案矩阵有几个特性,如果打表可供发现:

  1.在n维空间下,加入若干个n-1维空间的答案序列为n-1阶等差数列。f(n,k)=f(n,k-1)+f(n-1,k-1)。→很显然,k≤n时,f(n,k)=2n

  2.在放入k个向量的时候,如果是n维空间,答案很像∑C(i,k)。→很显然,k≤n时,f(n,k)=2n

  于是,我只知道二维是等差数列,只知道上面的两个很显然,于是骗了65。中间也想到过第一个现象,但是因为去钻T3了而未发现。

  至于是为什么呢?WJ大佬讲的很好。类比2维,n维中加入第k个n-1维空间时,只需要考虑增量。关键在于增量怎么统计。很显然的是,每两个n-1维空间都有“交点”n-2维空间。而增量就是k-1个n-1维空间和第k个n-1维空间的k-1个n-2维交点对这个加入的n-1维空间的划分数。这个结论看上去不是很显然,但确实如此。因为这样划分出的n-1维空间,就是新切割出的n维空间的界限。于是第一条得证。

  而第二条,使用数学归纳法易证。硬要证,可以补全负维空间,然后考虑每个0维的贡献,每个的路径数就是C(i,k)。

  T3是一个几乎完全未知的领域。n和k都很大,最开始以为是O(1)的,然而远非如此。Polya定理,所有置换中一种方法置换等于自身的方案之和的平均值就是置换同构的方案数。然后,考虑旋转m下,一种方法置换等于自身一定是有gcd(n,m)的循环节(类似字符串中KMP找循环节的理论)。于是,答案就是(1/n)*∑d|nphi(n/d)*a(d)。中间a(d)指长为d的循环节首尾不同相邻位不同且至多选择k种颜色的方案数,中间最重要的是不考虑旋转同构。有DP方程式:a(d)=(k-1)*a(d-2)+(k-2)*a(d-1)。前一半指的是第d-1个位置的颜色钦定与第一个颜色相同的方案数,a(d-2)中d-2号位置肯定和1号不同。后一半就是d-1≠1的情况。这个式子经过一番化简之后,可以得到:a(d)=(k-1)n+(k-1)(-1)n

  在这里%一发WJ大佬。这个方程可以怎么得到呢?有一个显然的事实,这样的常数递推方程一定有通项。使用特征方程x2=(k-1)+(k-2)*x,可以算出两个特征根:x1=-1,x2=k-1。于是,通项一定是an=A*x1n+B*x2n,A和B为常数。因为a1=0且a2=k(k-1),列方程待定系数可得A=k-1,B=1。

  于是,可以枚举因子d并求出其phi。然后,使用快速幂算出a(d)。最后当然还是要求出逆元n-1的。使用试除法是O(sqrt n)的,但是如果使用pollard-rho和miller-rabin就会高效的多。

  注:中间那个DP方程式挺像错排的,f(i)=(i-1)*[f(i-2)+f(i-1)]。i-1是钦定之前的位置,f(i-2)指该位置放在i号位上,f(i-1)指该位置不放在i号位上的i-1个点的情况。

  下午,JCY的数据结构讲了很多。之后再讲杂题。杂题中有很多好题,可是总觉得自己时间很紧,太紧了。

  晚上,学习了一下无旋treap。无旋的treap也是需要rd的。split呢,需要返回一个pair然后如是合并。merge呢,如果两棵树保证完全的单调,则可以像左偏树那样合并。如果没有完全的单调性,则必须启发式合并。"启发式"呢,就是小的一个一个往大的插,单个就是O(log)的,启发式又自带一个O(log)。至于为什么要学无旋treap呢?因为无旋treap不像splay均摊复杂度,而又可以方便的split。当treap带上split和merge的时候,大概rotate也会成为一个废物的操作吧。

20171223 DAY5

  T1其实不难,中间也想到了。因为k只有500000,所以很明显要按照列推。中间一行对应上面两个, 如果把式子写出来就AC了。但是我却并没有把式子写出来,中间的思路都是混沌的(也怪自己的草稿纸太不争气)。就是说,思路应该连缀成文,这个样子才不会昏。

  我左边那个叫做ZJC的大佬说,这么水的题我却爆了int,实在是太可惜了。我立即膜了一发,说您实在是太强了。什么一天出锅三天补锅,您这么强的人就没有出过锅。ZJC摇了摇头,说你实在是太无聊了,像我这么强的人就不用你膜了,如果你实在要膜就跪下来吧。我立即明白了,原来大佬也是有骨气的啊。

  至于为什么我第一题是0分?因为我n, k, b的顺序出了错。而WJ的第一题?编译超时?是因为他定义了一个1e7的数组,然后使用“={1,1}”,强迫g++帮他打一个1e7的大表,而g++说拒绝。

  T2是一个很巧妙的DP。f[x][y]表示x和y是否可行,而f[x][x]一定可行。转移很简单,x走2步y走1步,对应状态转移。不过,这样复杂度无法保证,使用菊花图就可以轻松的卡掉了。于是考虑拆分状态。f[x][y][0]表示该x走第一步了,后继状态f[x'][y][1]。f[x'][y][1]表示该x走第二步了,后继状态f[x''][y][2]。f[x''][y][2]表示该y走第一步了,后继状态f[x''][y'][0]。点对(x,y)可行当且仅当f[x][y][0]可行,初始时f[x][x][0]可行。倒推更方便,建反图跑BFS。但是建正图跑记忆化搜索也可以,但是会出现环的情况比较麻烦。

  T3之前考过,YYF的分阶段方法确实很优。而我使用的是分治,统计过mid的区间答案,单调指针+2-pointer&bucket维护。而YJQ使用的做法也很巧妙。他从左往右枚举右边界R,于是左边界可行当且仅当max-min+L-R=0。而max-min+L-R≥0, 所以只需要维护区间最小值与个数即可。然而,max和min的变化又如何统计呢?使用单调栈,弹出一个元素就修改其值所对应的区间即可。

  下午终于是YJQ大佬了(JCY大佬当然也是强炸天的角色)。中午我打饭的时候,突然后面冒出一个声音:你们食堂什么好吃啊?可是吓了我一大跳。吃饭的时候,YJQ大佬谈笑风生,说他们那个ACM队(中间有翁文涛)和任之洲那个队与杜渝浩那个队gang。本来稳操胜券,无奈参加一场比赛以两道大模拟压轴,码力不够终被刷下。而THU的教练本来力保任之洲,于是之后的一场比赛中,不让YJQ队参加而让一个更弱的队参加。更无奈的是,那个场是一个“SB场”,弱队码力过强最终入围World-Final。XGG也要参加明年7月在P大的World-Final,YJQ本想乘此机会再会“朱瘤”无奈要回家。

  从这个故事中,我们可以认识到:一个人要较为全面的发展,提高码力,才能减少翻车的可能性。

  下午YJQ讲图论,终于没有全场蒙了。但是,n个结点的SCC/BCC/二分图的计数到底是什么鬼?

  还有,单双树确实很有趣。WQ确实是深有造诣,一般有两种构造方法。第一种是以割点为界,但有局限性。第二种是把每个点双列出来,点双上的点连向该点,史称“圆方树”,十分高效。

20171224 Day6

  上午照例考试。

  T1询问区间的绝对众数。绝对众数,就是MODE那玩意儿。不过,此题做法确实很多。

  法一,CDQ 或 位置线段树 + vector 或 按权值分每个根的位置线段树。做法是前者维护出每个区间的可能众数和残留次数,后者用于验证。一个是离线的,一个是在线的。

  法二,主席树。权值线段树+前缀和,查询的时候siz相减往人多的方向走。

  法三,rand find。这是一种非常优秀的方法,因为一个区间如果有绝对众数,那么随机选出一个数来就找到的概率超过一半。如果做很多次,就几乎不会失败。好写好调,推广容易。

  法四,分块。因为时间最后给了4s,所以能过。

  但是,所有区间绝对众数的∑该怎么统计呢?

  T2是裸的O(nlogn)石子合并,楼教八题之一。使用Garsia-Wachs贪心,再带上平衡树优化或者像ZJC一样卡常数就能过了。

  T3是一道很不错的网络流。朴素的最小割很容易卡,如果具体分析原因其实是这条路径割上游,那条路径割下游,然而可以走这条路径的上游和那条路径的下游,如何避免?考虑到那条路径的上游和这条路径的下游是没有割的,中间的边如果可以反着走那么就可以很好的避免这种情况的发生。另外又是最小割,于是就好了。

  下午YJQ讲网络流建模。中间几乎所有题都是方格图,绝望。

  之后,打球。RYF打球很强的,特别爽。

  晚上,ZJC把锅甩给我,居然让我讲KAND。我要从位运算开始讲起,讲如何容斥,讲如何枚举子集,讲为什么是3n,讲什么是FWT,讲分治。基本上没有什么人听,觉得自己好废物啊……

  好废物啊………………

20171225 Day7

  作为一个新晋升的十七岁废物,百感交集肯定是有的。家里面很给力,不过送来的确实太多了。二十多个橘子五十多粒桂圆,这分明就是让我和班上的同学私分了嘛!几十块姜饼,照例是要孝敬生活老师一盒的,在机房里送了一盒半(每人一块人人开心),剩下来的就用于补充蛋糕之不足了。对晚上七八个人围在一个小蛋糕之前的神奇情景感到好奇和恐惧。

  今天一整天都在讲高端数论,老师姓陈,大三,电子科大,ACM错失一队。他高中时完全没有接触,两三年来确实很强。今天一开始,他就说:FFT是今天最简单的东西。FFT,FWT,生成函数(!!!),莫比乌斯反演,杜教筛,Polya和Burnside,线性基……其实他讲的挺好的,只是可能还是经验不足。一旦让人弃疗,则下面就会大乱而不可收拾。弃疗的人,自然也是良莠不齐的。而且还有很多人打打笑笑吵吵闹闹,分明就是砸场子的。之后我在高一讲课的时候,一定也要注意这种情况。第一,必须卡紧时间,并时刻给人暗示,如果有东西需要大家思考,也不能放任时间流逝。第二,板书必须足够工整,语言必须足够清晰,准备的内容必须合当,如果乱写乱画乱说一通,则会给人一种消极的感受。第三,如果有人围上来问问题,若此时下面正在想问题,就可以卡紧时间稍作解释,之后再对着所有人讲,否则就让他坐回位置让他讲,然后直接对着所有人解释。第四,一定要对自己所讲的东西充分了解,才能不紧不慢,不被别人问倒并让人清晰了解。不过,东西不宜讲的过透,需要留给人思考的余地。

  生成函数真心强!!!

20171226 Day8

  这是炸了的。硬gang第一题,只根据每个点的答案而不考虑是怎么得到的,这样的打表确实是不行的。虽然最后还是找出了规律,但实在是太不优。考后竟然还埋怨别人不停咳嗽,实在是大错。最后,T1也只有60分,原因是写成了“prime[B/1000]”,远远越界,和爆int可以相提并论。

  T1可以证明。因为cos可以合并,最后答案就是φ+μ啦。使用杜教筛1e8可以满分,使用线性筛1e7可以85。

  T2是一道点分,或者是树链剖分“优化DP”。O(dep)的暴力可写,但是因为时间分配不当最后只写了20分。

  T3是一道网络流。实质上是两道题,第一道是交换糖果,第二道是分配01并求最小值。很优秀的复杂度。

  下午陈老师讲博弈论和计算几何。博弈论是没有办法指望别人听的,但是计算几何讲的还是真心好。他的算几应该是很不错的(他说博弈论水一下就是的)。

20171227 Day9

  上午考试,XGG命题。题面非常高大上。

  T1,是一道看似复杂度不对但其实可以证明的。使用map记忆化搜索,并用ST表辅助二分找到对应拐弯点。证明过程非常优秀。

  T2,是一道NOIP训练时做过的题目,而且我本来还打算给高一的讲(虽然最后因为时间原因没有讲成)。信心满满觉得自己可以AC,无奈最后只有10分。一看,呀,memset写错了!其实,最开始我写成了“sizeof(n+1)”后来第三题也这么写,发现挂了才匆匆改成“sizeof(int)*(n+1)”。却没有深入思考,其实应该写成“sizeof(f[u])”的。毕竟是三维的数组,如果像二维那样写还是很不一样的。以前,LMY说他不敢这么写怕挂,当时我还笑他。后来,NOIPGR时,做一道二分图的原题,也挂了就是memset的原因。还是应该吃一堑长一智才行的。

  T3,是一道很不错的网络流。应该还是自己状态比较好,时间比较充裕,才写了出来。中间有一点没有想到,就是总的流量跑下来是一定的(单峰函数来源),于是并没有必要三分套网络流,而是先跑出总流量三分出对应点,再跑一遍网络流并构造方案。构造方案是很巧妙的,要从一组可行流中剥出一个可行流,使得和另一个同向。这个其实可以分flow,像DINIC的DFS那样跑。因为三分套网络流,于是T了一个点,无论如何也卡不过。

  晚上讲课,我自己已经准备已久了。充分的准备肯定是有好处的,当然占时间也没有太多。不过还是出了小问题,就是没有想到PowerPoint 2016与2007的兼容性都那么差!匆匆修改,终于上台。似乎同学们都挺专注的,颓的确实不多。觉得自己很有成就感。毕竟为了遴选讲课内容,还是总结了很多老师讲课的优缺点的。

  有人问我要QQ,但我不上QQ啊QAQ!于是给了他们我的email,如果他们找我,我应该还是会认真答复的。

20171228 Day10

  这一天,嗯……

  T1,大型演习。暑假的时候XGG出过一道叫做project的题目,这道题目是在那个CDQ+单调栈的基础上再加上主席树的。好神啊……

  T2,柚的策略。这道题的标解是O(n3)的,但ZH的ZZH大佬给出了O(n2)的做法。

  T3,加帕里图书馆。是一道区间字符串统计DP,不会不会……

  下午,XGG讲DP优化。实在是太神了。

20171229 Day11

  快要结束了呢。今天的题也特别有意思。

  T1,奇诺之旅。最大基环森林可以用KRUSKAL的拟阵做,空集独立遗传性扩充性,扩充性最难证,但这种问题似乎直觉打表也可以……T3脑洞了太久,我只来得及写O(n2)的做法。问题思考的还是不够深入,离线的连并查集都不用。其实还是不愿意深入思考。因为是离线的,只需要把非基环树的边的影响统计了就可以了。因为是直接修改至环,所以并不需要并查集这样高端的操作。分类讨论其实并不复杂。

  T2,占卜的准备。Impossible完全是拿来唬人的。每次选x坐标最小的,选最靠上或是最靠下的,方案一定构造的出来,而且一定不会相交了。当时纠结是写阶乘级的还是random_shuffle,最终只得了10分。中间没有判交的操作,如果判了交不知道能否有30……

  T3,空白的棋盘。这是一道通信题,非传统题。题目给了一个grader.cpp和一个grader.h,你需要写出两个程序shiro.cpp和sora.cpp。题目是这样的:一个128*128的棋盘,A最开始在(s,t),B想让A走最短路到(ex,ey)。他们之间的交流,仅仅限于给棋盘的每个位置赋值01。除此之外,A走的段数还不能超过29。这是一个分块的做法,每一行四位编码,对应于跳21~26。在同一行间再分跳1步和跳sqrt步。总体过程就是先上下跳,再左右跳。中间行与行花色和纯色交替,一切都很清楚了。

  当时考试时,一直想的是左右上下交替跳。于是一直都很卡。

  下午,是XGG的杂题专场。先是拟阵,后是JOI的通信题专场。后者就是乱搞专场啊!!!

未完待续……