*VP Codeforces Round 958 (Div. 2)
A
显然只会分裂出 1,模拟即可。
B
首先可以将一段 0 看成一个 0。
考虑维护一个栈表示当前状态。
每次加入字符后只要栈顶三个元素中有两个 1 和一个 0 就换成一个 1。
最后只需判断栈中是否有 0。
C
显然每个数都是 \(n\) 的子集。
考虑最高位,因为递增所以肯定是前面若干个数为 0,后面若干个数为 1。
又因为相邻两个数的按位或为 \(n\),所以只可能是第一个数最高位为 0,后面全部为 1。
令 \(a_1=n\oplus hb(n)\),后面可以规约。
\(k=popcount(n)+1\),注意当 \(popcount(n)=1\) 时 \(k=1\)。
D
考虑 DP,设 \(f_{u,i}\) 为点 \(u\) 上的怪物在第 \(i\) 轮被打败时,\(u\) 子树内所有怪物对玩家造成的最小伤害和。
\(f_{u,i}=\sum_{v}\min_{y\neq i}f_{v,y}+a_ui\)。
手玩发现 \(i\) 较小,使用了 100,加上简单优化即可通过。
事实上 \(i\) 这一维是 \(O(\log n)\) 级别的,证明还不会。
E
考虑暴力,求出以 \(a_i\) 为最小值的极大区间 \([l_i,r_i]\),则答案为 \(\sum_i a_i(i-l_i+1)(r_i-i+1)\)。
考虑位置 \(p\) 的删除会对 \(i\) 的贡献产生什么影响:
- \(p=i\)
贡献变为 0。 - \(p\in[l_i,i)\)
贡献减去 \(a_i(r_i-i+1)\)。 - \(p\in(i,r_i]\)
贡献减去 \(a_i(i-l_i+1)\)。 - \(p=l_i-1\)
左端点会继续左移。 - \(p=r_i+1\)
右端点会继续右移。 - 其他
贡献不变
2 和 3 容易使用差分维护,4 和 5 可以把 \(i\) 挂到 \(p\) 上,ST 表维护区间最小值,二分即可求出新的端点。

浙公网安备 33010602011771号