2022 杭电多校第一场
A String
大概就是把 NOI2014动物园 这个题加了个编号模 \(k\) 的限制条件。
先建出 \(\rm fail\) 树,在 \(\rm fail\) 树上跳可以找出每个节点 i 对应的满足 \(2j>i\) 的最小祖先 \(j\) ,
\(i\) 的答案就是 \(j\) 到 \(i\) 这条链上满足 \(2x\equiv i({\rm mod}\ k)\) 的节点 \(x\) 数目,
差分拆成 \({\rm fail}(j)\) 到根的贡献和 \(i\) 到根的贡献,做一次 dfs 即可统计出答案,时间复杂度 \(O(\sum |S|)\) 。
B Dragon Slayer
直接暴力枚举去掉哪些墙,然后 bfs 检验一下是否连通即可。
C Backpack
设 \(f(i,j,k)\) 表示考虑了前 \(i\) 个物品,体积和为 \(j\) ,价值 xor 和为 \(k\) 的方案是否存在,用 bitset 压位即可。
D Ball
枚举两个点 \(A,B\),若 \(A,B\) 之间的距离是质数,则考虑找第三个点 \(C\) 使得 \(dis(A,C)\ge dis(A,B),dis(B,C)\le dis(A,B)\) 。
于是可以先将所有点两两之间的距离从小到大排序,并按照顺序枚举 \(dis(A,B)\) 与对应的 \(A,B\) ,对每个点维护两个 bitset 表示其他点到这个点的距离是否大于等于/是否小于等于当前枚举的 \(dis(A,B)\) ,那么计算合法的 \(C\) 点数目只需要将 bitset 求交即可,时间复杂度 \(O(\frac{n^3}{w})\) 。
E Grammar
题面太长太啰嗦,先鸽。
F Travel Plan
显然可以用莫比乌斯反演转化为对于每个 \(x\) ,只保留权值是 \(x\) 倍数的边形成的图的简单路径计数。
而由图中不存在偶环可以推出每条边最多只被一个环包含,即图是一个仙人掌,在仙人掌上 dp 求路径数即可。
G Treasure
首先建出并查集重构树,具体来说,用 Kruskal 找一棵最小生成树,并且每次向生成树中新增边时,就新增一个虚点连向这次合并的两个连通块。那么每次询问时,\(x\) 点能通过权值 \(\le y\) 的边到达的所有点一定会形成一棵子树,可以通过倍增跳祖先的方式找到这棵子树。考虑维护每棵子树的答案,那么当增大 \(x\) 点的权值时,可能影响 \(x\) 的所有祖先的答案,而这些影响可以拆成不超过 10 个连续段(若有某个 property 与 \(x\) 相同的点 \(y\) ,则答案变化量可能在 \(x\) 与 \(y\) 的 LCA 处发生变化),差分之后变成单点修改与区间求和,用树状数组即可维护答案,时间复杂度 \(O(10n\log n)\) 。