VP Educational Codeforces Round 30
A
显然贪心去尝试变最后的 \(k\) 个。
B
把两种字符看做 +1 和 -1,区间合法等价于和为零即两端前缀和相等,用 map 维护一下每个值最前的位置即可。
C
对每一列找出最靠上的能够取得最大值的位置,最优方案是将其上方的 1 都删去。
D
有解条件是 \(k\in[1,2n-1],2\nmid k\),考虑递归构造,交换分治中心旁边两个位置即可继续分治下去,将剩余限制均分两半即可,注意必须分成奇数且少的要给左边。
E
相当于排序后分成四段,枚举前三段断点则第四段断点的合法位置是一个区间,为了最小预处理区间内最小值即可。
F
这个问题不弱于 SAM 模板,故考虑 SAM。
建出 SAM 后找到每个前缀对应的位置,若该位置未被禁止则打上标记。
在 fail 树上 dfs 一遍即可求出每个等价类对应的 \(f\),容易求出答案。
时间复杂度 \(O(n)\)。

浙公网安备 33010602011771号