Codeforces Round #606 (Div. 1, based on Technocup 2020 Elimination Round 4)
A
只有 (one) 时删 (n),只有 (two) 时删 (w),出现 (twone) 时删 (o)。
B
发现 (a,b) 一定为割点,那么 (a,b) 将整张图分成了三个点集,没有被 (a,b) 夹在中间的两部分点集的大小乘积即为答案。
C
枚举短边长度 (r),发现一个数 (x),最多能填入当前矩形 (min(cnt_x,r)) 个,(cnt_x) 为 (x) 的出现个数。设 (sum=sumlimits_x min(cnt_x,r)),得长边长度最长为 (leftlfloor frac{sum}{r} ight floor)。因为短边最长为 (sqrt n),所以这样就能 (O(nsqrt n)) 求解答案了。构造方案时,将所有数按 (cnt_x) 排序,按顺序在斜着填即可。
D
设 (f_{x,0/1/2}) 表示在 (x) 子树内对应情况的方案数,(0) 为 (x) 被编号小于其父边的边删去,(1) 为通过父边删去 (x),(2) 为通过父边删去 (x) 父亲。设 (x) 儿子个数为 (k),(d) 及其之前的儿子对应的边都比父边编号小,即父边编号在 (d) 和 (d+1) 对应的边的编号之间,得转移为:
可以给根节点一个虚拟父亲,(0) 为根节点被删,(1) 为根节点没被删,因此答案为 (f_{1,0}+f_{1,1})。记录前缀积和后缀积即可快速转移。
E
在⛏了
F
能对答案产生贡献的串有 (varnothing,*,s,s*,*s,s*t),只有 (s*t) 不好统计。
分别建正串和反串的 (SAM),设第 (i) 个位置为 (*),考虑在以 (i-1) 为后缀对应的节点统计以 (i+1) 为前缀的节点的贡献。将 (i+1) 在反串的 (SAM) 对应的节点挂到 (i-1) 在正串的 (SAM) 对应的节点上。用 (set) 启发式合并维护每个点子树内所有挂着的节点的集合,该集合的贡献为这些点在 (Parent) 树上到根节点的链的并,通过 (dfs) 序即可维护。