题目 | A | B | C | D | E |
---|---|---|---|---|---|
通过 | √ | √ | √ | √ | √ |
其实是去年 ICPC 的组题,但是还是很有练习价值的。顺便复习了一下之前已经快要忘记的的内容。
Potassium 的题解请点我跳转。
A - Rikka with Intersections of Paths
题解
两个树上的链若有交点,则交点必然是两个链中至少一个链的 LCA。因此对于每个点,统计通过这个点的链数 \(n\) 与该点为 LCA 的链数 \(m\),用容斥原理即可得到以该点为交点的链组合方式为 \(C_n^k-C_{n-m}^k\)。
代码
1 |
|
B - Misunderstood … Missing
题解
注意到每次的操作虽然具有后效性,但是不具有前效性,因此可以从后往前 DP。DP 中需要用一个维度记录当前位置 \(i\) 之后所有采取攻击操作的位置 \(a_k\) 与当前位置的距离之和 \(\sum_k (a_k-i)\),以此计算操作 2 对 \(D\) 增加造成的总贡献。
需要滚动数组。
代码
1 |
|
C - Mediocre String Problem
题解
可以将所求的串拆成 \(aba'\) 的形式,其中 \(a'\) 为 \(a\) 的反串,\(b\) 是一个回文串。因此可以对 \(s\) 中的每一个下标 \(i\),统计从 \(i\) 开始向左能与 \(t\) 的前缀的反串匹配的最长长度 \(n\),与以 \(i+1\) 为左端点的回文串个数 \(m\),则这个点对答案的贡献为 \(nm\)。
第一个可以采用 Hash 在 \(\mathcal{O} (n\log n)\) 内完成(采用 ExKMP 可以达到 \(\mathcal{O} (n)\)),第二个可以用 Manacher。
学习了一下选择模数和基底的姿势,不要选择一些比较容易卡的数(比如常见大质数 \(1000000007\) 和 ull
自然溢出,后者被证明可以被 \(2^{13}\) 级别的串卡掉 1)。选择的原则是,模数用一个尽可能大的质数,基底选择一个具有一定规模的、能够让 Hash 值比较均匀分布的数为佳。这个页面给出了一些模数的选择方式。
虽然 ull
自然溢出的方式非常地快,但是也非常容易被卡。如果空间时间足够的话,采用双 Hash 是比较保险的行为。
所以说要用膜术打败模数,选择某个特殊 8 位质数一定可以过
代码
1 |
|
D - Magic Potion
题解
魔性构图。如果不设置 \(K\) 点,而是给每个点都连接流量为 \(2\) 的边,则会出现攻击了 2 次的人数大于 \(k\) 的情况,因此这种情况是不可行的。
代码
1 | //19:38 |
E - Prime Game
题解
分别对每个数 \(a_i\) 的质因数 \(p_i\) 考虑对所有 \((l,r)\) 的贡献,则显然 \(p_i\) 无法做贡献的情况是 \((l,r)\) 区间中不含有 \(p_i\),因此区间总数量 \(C_{n+1}^2\) 需要减去这部分。最后统计一下即可。
代码
1 |
|
https://blog.csdn.net/wyfcyx_forever/article/details/39925891↩