GDOI2018
前言
该拿的分一分不失,是我本次GDOI最成功的地方
Day0
考前延续了在JZ腐败的习惯,直到十点半还在淦CR,突然意识到我自己可能真的完蛋了,于是删了安卓模拟器来复习模板(事实证明并没有对后面的解题起到作用但是直到心情恢复了一点)
带着非常慌张的心,抱着自己带的抱枕,还是睡着了
Day1
早餐超级好吃
直到走到了一中才发现天气热到爆炸,还好考场里面有空调,路上一直在看自己博客里面的FFT模板
开考前30分钟,马上开始写FFT和多项式求逆,希望如果能碰到一道裸题就是血赚(然而,我数学功底这么差肯定是没戏的)
看看题目,T1比较好玩,枚举一下因子加个break就好了
第二题,看起来很眼熟,也想到了差分,but问题就在于,我之前做过一道题目,也是一样的大意,只不过只能向着一个方向转而且不可以取模,于是就在这里被困住了,想到了差分但是没有想到正解,开始往dp想
我们发现一件事情,一个位置显然不可能又被加也又被减,证明是显然的,先看第三题
T3发现如果没有修改,就可以直接上主席树,所以把修改拿出来单独计算贡献
修改是一个三维偏序的问题,时间,时间+深度,子树限制三个维度
沿用上面的思想,可以写一个BIT套主席树,这种东西我考场上肯定搞不出来(我太菜辣),让后感觉我凉凉了
回去淦第二题
发现了这个性质,以及第二个样例说明的性质(可以将一个数加上m使得答案变小)我们可以写一个dp
用f[i][j]表示做到节点i,j表示这个i被进行的操作是加还是减
由于我当时还有一个结论就是,一个位置的数被加上m不可能超过1次,所以j就有四种状态(减去a[i],加上m-a[i],减去a[i]+m,加上2m-a[i])
那么转移就直接枚举j和j' 如果j和j' 奇偶性相同,那么肯定就可以延伸,f[i][j]=f[i-1][j']+max(0,a[i][j]-a[i-1][j'])
否则就只能重新开一次操作(前面已经证明不可能又加又减)f[i][j]=f[i-1][j']+a[i][j]
那么我们就得到了一个比正解还要优秀的复杂度O(n)的算法
然而它是错误的,测一下稍微大一点的样例就发现了,至今我还不知道为什么这个算法是错的
不过我还是把这个dp交了上去因为它可以过掉n=20的那个样例,所以我觉得应该可以拿到前20分
回来一看第三题,突然想到可以cdq分治(为什么这么晚才想到),让后愉快的60行随手一写就没有了
第四题看了一下,知道jz讲过,不过我当时就是一点也听不懂,所以现在知道一定不能花任何时间在上面(事实上,我三天都沿用了这个策略,所以才有比较多的时间来淦前面三道题,做到比估分一分不少)
出来了发现周围都300+,知道自己凉凉了
Day1'
讲题很好啊,第一题出题人说数据很水我就放心了,因为我太懒没有用前缀和来判断,复杂度应该是O(n*σ(n))的,很虚
第二题听到samjia讲出正解就心态崩了,本来还想上去讲一讲我那个dp但是知道自己没戏了
所幸第三题正解和我做法一样,稍微比较安慰
T4没有认真听,听了也听不懂
发成绩了:orz whjAK爷
自己220,仔细看发现第三题90pts?莫名喜感的WA
第二题多了两个点的分数,所以和第三题抵消了(感觉可以和同学吹一年了:我就是那唯一一个90分的!)
让后就去皮了,因为成绩条上面那个220的0被卡在边缘没掉了,就和别人吹我22分,全校最低,结果被sqlyy怒怼
晚上躲在酒店淦三国杀,心态轻松不少,也是随便看了看模板就继续抱着Misakaの抱枕睡了
Day2
早餐没那么好吃了因为制度改了,随便吃了一些去背模板
沿袭了昨天打NTT模板的习惯,还把昨天打错的一个地方改对了
结果也没有用到
T1题目太长了啊,不知道在干什么还十分暴力,先看看T2
T2特别玄学,意思清晰易懂但是我并没有什么思路,看到有个k次方我就知道我这题可能凉凉了
T3看到我就十分激动,线段树!单调栈!随机!让后没有认真想就回去淦T1
T1十分艰难的看懂了,感觉建好图就可以二分+dijk了
but建图开始懵逼,一开始理解错了,以为是求互质数对的个数
手推一堆式子发现不对,才意识到是要求互质数对之和
那么思路就很明显了,设f(d)=∑∑(i+j)*[gcd(i,j)=1] (1<=i<=n , 1<=j<=m 这里n,m是两个点的魔法师数量)
搞一个F(d)=∑f(n) (d|n)
就可以得到f(d)=∑F(n)*μ(n/d)
让后我第二次搞错了,我以为要求∑f(d) 搞了一堆东西,然而其实只要求f(1)
可以预处理一个μ(d)的前缀和让后就可以分块除法了
但是问题又来了,我发现分块除法似乎并不能算出正确的f(1)
调试一下发现问题了 F(d)不知是和n/d , m/d 有关而且和d也有关!
感觉100分是不行了,改回60分吧
想想T2T3感觉t3可做一点,去淦t3
随手一个线段树加上单调栈合并,手打一个O(n^2)的合并,大样例炸成没法调试
回来一想F(d)的d不是可以提出来吗,乘到μ(d)那里面去做前缀和不就完了吗
一发过掉大样例,暗喜之余回来淦T3
t3代码直接全部删掉重构,写着写着想到一个O(n)合并两个单调栈的答案的方法
由于题目写着数据随机,放心大胆的把线段树的每个节点开vector来存单调栈(事实证明这样一点也不优美)
让后开始写两天来第一个对拍(因为大样例太大了)
随便调了一调,过掉了大样例,然而用了4s而且我已经手动开了氧气优化
大样例才5w啊感觉凉凉了
比赛快要结束,当时就觉得特别的急,都快砸键盘了,也没有想到什么更好的优化了
于是day2就end了
Day2'
下午听讲评迟到了,问了一下lyyT1正解知道自己应该稳了
T2什么斯特林展开,也听都听不懂,反正数学题都是见到就是赚到
听完T3正解更加加强了我凉凉的心情,链表加上数组,一个log,感觉可能我那个就真的只有暴力分了
T4没认真听,题面都记不清了
所以开始一波不正经的估分100+0+70+0也不知道为什么当时我觉得我T3能赚到70分
结果成绩发下来T3真是70,看了一下,1600ms+ ,感谢一中评测机
感觉人生充满希望,第一次进到day3
于是晚上开始浪了,但是依然没有忘记抱着抱枕睡觉(这是最重要的)
Day3
早餐制度又改回来了
感觉今天就是要放松,因为我估计我可能一道题都不会做的,多水水就好(事实证明我错了,T2T3我都是当场就想出了正解的)
考场气氛颇为神秘,中途还跳闸?
看到T1感觉是一个偏序问题?想一想数据结构发现不行,于是开始想暴力:建出竞赛图之后只要遍历一下就知道可不可能胜利了
然后正常人应该都是去想tarjan缩点求强连通分量
然而我感觉tarjan好像忘了怎么写了(捂脸)于是先写了个floyd
floyd这个东西,明显是可以用bitset优化的嘛,让后测了一下时间11s,知道自己没开氧气优化,开了之后就1.6s稳稳的了
看看T2
看了一下以为要动态点分
不过很快就考虑到一个事实,我们走到i,距离的增量就是len[i]*(n-2*size[i])
那么50分就到手了,开个数组维护一下size就好了,每次从1开始往下走,等等,这样好像还要预处理每个节点i子树所有点到他的距离之和dis[i]?
这个东西我似乎没有办法在O(lg n^k)内求出来,于是便和100分失之交臂
本来如果可以求出来那么本题就做完了,开个map维护一个节点size和dis的增量,因为一次删除最多影响到log个节点
50pts-
第三题,看了一下要求一个路径条数,很快就知道是网络流
让后,字符串?后缀自动机!
这和我考前和别人吹水说“今天有一道后缀网络流”不谋而合
完了,这100分放在我面前就这么跑了
其实如果我当时打了网路流,应该还是有戏拿到50分的,因为可以把那些串插入trie让后每一层的节点个数就是最少需要的路径条数
这里的50pts也没了
而且没有大样例,我对前面的110分能否拿到都感到很悬
就这样,GDOI day3结束了
Day3'
正解我大概都知道是什么了,T4不想听,于是下午便没有去
T1是线段树优化连边,但是我没有写过,而且似乎还要一些偏序的求解才能过掉
T3果然和我想的一模一样,T2想想就知道应该是这样的
下午一直在淦游戏,晚上也是,不过还是按时抱着抱枕睡了
Day4
看了看排名,30
自己水平太差无话可说,但是看到我排名前面几位大佬,突然为它们感到惋惜
cty,mj两位高一神犇这次都翻车了,不过他们明年就肯定稳了
最惋惜的就是ymw大佬,看到他day2 95pts我就似乎明白了什么,和他一起做的几次模拟赛,他都是前3的排名
本来以为他是稳稳的队爷,真是太可惜了。
后记
听说30名可以申请**USC了,那么,6月见!