CSP2019 游记

Day-50 to Day -2

被六校联合训练各种神仙题血虐,天天被吊打,搞得 CSP 都没信心考了……

Day -1

和 G1 的神仙们打了一整天 MC,真的是一整天,还被 dyt 嘲讽说我太颓了(可怜)

Day 0

感觉好虚啊……毕竟自己已经高二了,CSP 再炸就退役了(泪奔)

所以赶紧把模板题打了个遍(什么后缀自动机回文自动机splay左偏树也打了一遍),然后晚上更虚了,赶紧打了一晚上隔膜(大雾)来放松一下身♂心。

lqs 真的是假死了,我恨不得把他屏蔽了/xyx

怀着忐忑不安的心情入眠,祈祷第一天的题目不要那么难。

Day 1

T1

果真是 D1T1 难度,3min 写完过大样例。

T2

想了一会儿,大概觉得记左括号为 1,右括号为 -1,那实际上就是找到祖先当中前缀和和自己相同,且到自己路径上的所有点的前缀和都不小于自己。

可以直接倍增维护,但是我懒得写,就又想了个 O ( n ) O(n) O(n) 的 dp。

f ( i ) f(i) f(i) 表示以 i i i 为右端点的合法括号序列, g ( i ) g(i) g(i) 表示从 i i i 向上第一个无法匹配的左括号的位置(就像我这种单身汪一样),那么如果当前是左括号, g ( i ) = i g(i)=i g(i)=i,否则大概就是找到最短能够匹配的括号序列, g g g 从上面转移过来,显然有了 g g g f f f 也很好求了。

应该出到 1 0 7 10^7 107 的(大雾)

T3

此时刚过 9 9 9 点,满怀期待的我发出了感慨:CSP 果真是 CSP,题目真良心,剩下将近 3 h 3h 3h 给我刚 T3,这还能不会做的吗?要是不会做,我就直播********(flag)

仔细思考感觉就是个贪心,每次找到当前数字能匹配的最小点的编号,并且不能和之前出现矛盾。感觉是维护一个删边顺序的 DAG,保证选边不能出现环。暴力应该可以 O ( n 3 ) O(n^3) O(n3) 维护,然而各种情况真的·好·难·写,而且还过不了。

一直刚到最后,想着真没时间了,赶紧打个 10 10 10 分暴力滚粗吧,菊花和链的情况我也完全不会(wzy 果然是个大菜鸡)。最后要交卷了,想起来 T1T2 还没拍,T3 又只有 10 分,这不是稳稳退役的节奏吗(哭了哭了)?

赶紧回头看一眼 T1T2 的代码,发现 T1 输出的数组居然还开小了,差点 T1 爆成 50 分(windows 真是可怕,数组开小连个 RE 都没有),此时 11:59,然后就交卷滚粗。

赛后讨论

djq 和 hhr 都 ak 了(泪奔),怎么会有这么强的人!!!!lqs 说他 235,他好像把菊花搞♂出来了 orz……看来就我最低,我又垫底了(泪奔)

T3 大概是不需要维护所有边形成的 dag,对于每个点,不难发现和它相邻的边必然有个固定的先后顺序,并且要求某些操作相邻,于是对于每个点,和它相邻的边可以形成一条先后关系的链,开个链表暴力维护一下就好了……真的是神仙题啊 orz,但是部分分确实不好给,导致我这种菜鸡只能花了 3 h 3h 3h 拿到了 10 10 10 分的好成绩(呜)

慌得一批,测民间数据,幸好前两题没挂,100+100+10 垫底滚粗了……明天再考不好就要退役了啊……

回到家自闭了好久,找了好朋友聊了好久的天,才终于把自己的心情平复下来……

Day 2

T1

居然 T1 就是个 dp 计数,模数还是 998244353,让我一度想推多项式(雾),但是幸亏理智不断告诉自己:这是 CSP 啊,才勉强去继续想 dp。

大概就是拿总数减掉超过一半,超过一半的话,枚举是哪个东西超过了一半,然后 f i f_i fi 表示当前数量 − - 其它物品数量 = i =i =i 的方案数,就可以直接 O ( n 2 m ) O(n^2m) O(n2m) 了(当然分治 NTT 的确可以做到 O ( n m l o g 2 n ) O(nmlog^2n) O(nmlog2n)

这题感觉还有点难(可能是因为我是准退役选手的缘故),我 9 点才写完过了样例……感觉和小凯的疑惑是一个难度的(雾)

T2

好复杂的算式啊……吓死我了,刚开始还在想柯西不等式来着(雾),理智又告诉我这是 CSP 啊,才勉强去想正常的做法。

O ( n 3 ) O(n^3) O(n3) 的 dp 很好想,打个标记也就能优化成 O ( n 2 ) O(n^2) O(n2) 了,64 分了,我不虚了。想了一会儿结论,感觉这个 dp 的 f ( i , j ) f(i,j) f(i,j)(状态表示结尾为 i i i,上一次结尾为 j j j),去除不可行状态之后, f ( i , j ) f(i,j) f(i,j) 是按照 j j j 递增而递减的。

大概证(理性感知)了一下,拍了 2w 个数据没问题,就开始写了,记 g i g_i gi 表示 i i i 位置最优情况下最后一段的大小,那么显然:

g i = min ⁡ { s i − s j ∣ s i − s j ≥ g j } g_i=\min\{s_i-s_j|s_i-s_j \ge g_j\} gi=min{sisjsisjgj}

显然后面的条件转换一下就变成了 s i ≥ s j + g j s_i \ge s_j+g_j sisj+gj,因此直接单调栈维护 s j + g j s_j+g_j sj+gj 即可,查询时可以在单调栈上二分, O ( n l o g n ) O(nlogn) O(nlogn)

O ( n ) O(n) O(n) 做法也很显然了, s i s_i si 递增,因此在单调栈上维护一个指针,two pointers 即可。但是看到 4E7 感觉卡空间卡时间,而且数据生成器好复杂,还要写高精度,果断放弃最后 12 分去看 T3。

T3

看完之后,想着两个子树合并好像可以 O ( l o g n ) O(logn) O(logn) 二分出重心,那是不是直接换根 dp 就行了……但感觉完全不可写,想其他办法。

考虑每个节点的贡献,对于非重心节点,记其最大子树大小为 f f f,次大子树大小为 s s s,显然由于 f > n / 2 f>n/2 f>n/2,我们必须要砍掉 f f f 里的某棵子树才能使得其成为重心。不妨设砍掉的子树大小为 x x x,则: max ⁡ ( f − x , s ) ≤ ( n − x ) / 2 \max(f-x,s) \le (n-x)/2 max(fx,s)(nx)/2,解一下不等式就可以得到 2 f − n ≤ x ≤ n − 2 s 2f-n \le x \le n-2s 2fnxn2s,所以大概是在 d f s dfs dfs 序上做一个二维数点,数出子树大小在某个范围内的子树个数。

重心节点的话大概就另外写一个暴力即可。复杂度 O ( n l o g n ) O(nlogn) O(nlogn),听说有线性做法 orz。

具体实现有不少细节,调到最后十几 min ⁡ \min min 才过大样例……幸好没写 T2 的 12 分,不然 T3 就没了。

UPD:赛后 10min 不到改好 T2 满分做法……太可惜了

赛后讨论

djq 说他 3.5h 刚好写完 T1T2T3,又 AK 了 orzzzzzz……

我还是很虚,回去测了一下民间数据,还好没炸,100+88+100=288,看来可能应该大概或许能够暂时地逃过退役了……

目前总分 498,被各路神仙吊着锤(哭了),不过这次大概是打出了我的最好水平,看来也好菜啊……希望以后考试也能很好地发挥吧(可怜)

总结

D1T3 真的是六道题里最难的……这种思维题果然不适合我这种没有脑子的选手……

希望最终成绩和民间数据测得一样吧,这样我还不至于退役……

也祝各位 NOIWC RP++,省选 RP++ 进省队吧(反正我是没希望了)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值