*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\) 的贡献产生什么影响:

  1. \(p=i\)
    贡献变为 0。
  2. \(p\in[l_i,i)\)
    贡献减去 \(a_i(r_i-i+1)\)
  3. \(p\in(i,r_i]\)
    贡献减去 \(a_i(i-l_i+1)\)
  4. \(p=l_i-1\)
    左端点会继续左移。
  5. \(p=r_i+1\)
    右端点会继续右移。
  6. 其他
    贡献不变

2 和 3 容易使用差分维护,4 和 5 可以把 \(i\) 挂到 \(p\) 上,ST 表维护区间最小值,二分即可求出新的端点。

posted @ 2025-01-27 18:28  ax_by_c  阅读(8)  评论(0)    收藏  举报