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开始枚举,那么所有满足条件的区间当前一定是他的最优答案,直接更新。

问题就在于怎么找到这些区间,以及处理完这些区间后如何再把被剔除掉的区间重新加回去。

观察发现这些区间也是连续的一段,可以利用线段树二分解决。

计算答案的话用树状数组即可。

(口胡的非常水,但细节巨多,调了一整晚……)

posted @ 2022-07-13 21:47  Displace  阅读(60)  评论(0)    收藏  举报