Loading

6.27 考后总结

时间安排

7:10--7:30 读题。
7:30--9:00
T1,显然要 dp 线性基。为了方便只考虑最简线性基,考虑如何使得最大值小于等于 X ,发现由于是最简线性基,取到最大即为求所有数的异或和,容易满足题目限制。
9:00--10:40
T3,显然有贪心的思路,然后考虑这个东西只和串出现位置有关。考虑到建出 sam 的 fail 树后可以 dsu 出每个串位置集合。进一步发现可以根号分治,对于 \(len\gt B\) 的串可以暴力跳,询问离线到 fail 树上就行了,对于 \(len\leq B\) 的串,可以枚举长度,然后扫一遍即可预处理得到所有相关的答案。平衡一下可以得到 \(O(n\sqrt{n\log n})\) 的复杂度。
造一下数据发现常数有点大。
10:40--12:00
T2,一时没有想到如何很好的处理联通块的限制,先写暴力。
卡 T3 的常数,将 dsu 替换为线段树合并,自己造的数据大概可以在 2~2.5s 左右通过。

回顾反思

T2:
一个极大的失误在于没有想到可以用边数点数的关系来判定联通块。对于一棵树上的点集,为一个联通块当且仅当边数 - 点数 =1.
有了这个后起码暴力都能拿 80 左右了。
对于正解是简单的,考虑每条边和点的贡献,可以对应到若干个路径点对,更具体的,是若干个矩形。线段树维护扫描线即可。

T3:
思路和正解一模一样,然而常数奇大无比 T 成 40 了。
不能理解 \(O(n\sqrt{n\log n})\) 的复杂度为何数据范围要开到 \(n=1e5\)

赛时做法对 \(len\leq B\) 的串预处理,复杂度为 \(O(n\sqrt{n\log n})\)
换了一种实现:预处理的话显然造成了一定冗余,于是将短的串也放在 fail 树上做,并用 map 记忆化答案。由于这样的短串总出现次数不超过 \(O(n\sqrt n)\) ,所以复杂度是 \(O(n\sqrt n\log n)\)
显然这玩意理论复杂度是要比预处理要劣的,但是这玩意卡不满,常数也小,于是跑得飞快。

注意常数 !

posted @ 2023-06-27 20:11  Cafard  阅读(13)  评论(0)    收藏  举报