从哪里跌倒就在哪里站起。
A:
签到题
考虑每个排水口对答案的贡献,可以dp求解。
令(f_i)表示从某个排水口到(i)的贡献。
设(i)的度数为(d),则(f_v+=frac{f_i}{d})。
要写分数类+高精度。
然而我由于先乘后除所以被卡掉(30)分,离谱。
有人不拓扑排序也是(60)就离谱。
B:
考虑预处理(f_{i,j})表示前缀(i)中有(j)个字符为奇数。
f可以用前缀和求。
令(g_i)表示后缀(i...n)有多少个字符出现次数为奇数。
枚举前缀(AB),凭借(f)就可以更新答案。
枚举次数是调和级数。
优化1:枚举时不用双哈希,使用kmp。
加上这个优化我就过了吧。
优化2:显然(AB)的出现次数可以二分。可以证明时间复杂度是(O(n))。
优化3:枚举的((AB)^i)的函数值只可能有2种。所以我们只需要做(2n)次树状数组查询即可求出答案。
优化4:树状数组也是不必要的。考虑顺序扫描(AB)。
扫描后函数值只可能会变化(1),于是可以使用桶维护。
在后缀更新时如果更新处的值小于等于函数值,则把答案++。
当函数移动时加上/减去桶对应的值。
C:
考虑归并排序。
D: