2022.07.13 zrNOI模拟赛总结
1.时间安排
8:00~8:20 看题面
T1:字符串+DP题,送15分爆搜,字符集只有2可能有性质分,还有30分的 \(n^3\) DP。
T2:二分+构造题,n=2很好做,剩下的sub都没什么清晰的思路。
T3:数据结构题,需要转化题意,有20分随便写,还有10分 \(n^2\) 。
8:20~9:00
把T1的15分写了,以为字符集只有2的话超出字符集的串一定合法,大样例就否定了这个结论,猜了一些其他结论也寄了,就像怎么 \(n^3\) DP。
暂时没思路,换题。
9:00~9:30
确定了一个队的总题数一定是平均分,n=2时二分两队差值即可,自己手构数据没问题。
想了想 \(m=50\) 的分,似乎能贪心,但感觉很假,很容易被推翻。
9:30~10:00
发现T3可以贪心求答案,如果前面有空缺一定可以通过类似链的传递结构传递过去,全部扫描一遍后答案就出来了,这个过程是均摊 \(O(n)\) 的。
想着贪心的东西一般数据结构不能维护,就想着怎么转化成其他更容易维护的东西,想了很久没结果。
10:00~11:30
试着推T1 \(O(n^3)\) 的DP,设 \(f[i][j][k]\) 表示按错误的方法前 \(i\) 位的答案都相同,第 \(i\) 为的答案是 \(j\), T串第 \(j+1\) 位字符为 \(k\) 的方案数,匹配直接转移,失配按题意转移到0。
观察发现如果前j为存在border则不合法,枚举一下border长度,减去这些贡献。
发现dp答案差很远,一想似乎需要dp出来正确kmp的方案数,改了之后仍然不对。
想了很久问题出在哪里,发现还是在于重复减去的方式不当,但想不出来正确的方法,寄。
11:30~13:00
吃完饭回来开摆。
result:
T1:15 T2:20 T3:30
2总结
T1:
T2:
(待upd)
T3:
在贪心的基础上发现结论:设 \(cnt_i\) 为小于等于 \(i\) 的数字数量,则最后一个 \(cnt_i-i>0\) 的i+1就是答案。
这样可以 \(O(n\sqrt nlogn)\) 用线段树+莫队维护 (%%%J神)。
继续发掘性质,如果把被完全包含的区间剔除,剩下的区间按左端点升序排序后,右端点也是升序的。
考虑从大到小枚举答案,从n+1开始枚举,那么所有满足条件的区间当前一定是他的最优答案,直接更新。
问题就在于怎么找到这些区间,以及处理完这些区间后如何再把被剔除掉的区间重新加回去。
观察发现这些区间也是连续的一段,可以利用线段树二分解决。
计算答案的话用树状数组即可。
(口胡的非常水,但细节巨多,调了一整晚……)

浙公网安备 33010602011771号