Loading

Codeforces Round 958 (Div. 2)

传送门

A.

*900

水。

B.

*900

发现可以用操作把一串 0 缩成一个0,1 同理。都缩完之后会变成一个 01 交替的串。比较 0 和 1 的个数即可。

C.

*1300,贪心

猜结论。记 \(n\) 的二进制下有 \(x\) 个1, \(k\) 即为 \(x + 1\),可以证明这是最长的。从小到大把每一位1去掉后输出剩下的数即可。

D.

*2000,树形dp

删除操作最多 \(\log n\) 次,是因为一个点在一轮操作中不被删除当且仅当这个点相邻的点被删。

\(f_{i,j}\) 表示以 \(i\) 为根的子树中,点 \(i\)\(j\) 次被删除失去的最小生命值。转移即可。

这个题也好难,我觉得比 e 难。

E.

*2300,数据结构

参考了 Alex_wei 的题解,进行一个自己的理解。

对于静态版的问题,可以通过单调栈解决。加上修改,就先按照静态版,用单调栈把每个点为最小值的 \(L_i\)\(R_i\) 求出来。

再考虑本题。枚举最小值位置 \(i\),删去不同的位置对最小值为 \(a_i\) 的区间个数 \(p_i\) 的影响。

  • 若删去 \(i\)\(p_i\) 为 0。
  • 若删去 \([l_i + 1, i - 1]\) 的某个位置, \(p_i = (i - l_i - 1)(r_i - i)\)
  • 若删去 \([i + 1, r_i - 1]\) 的某个位置,\(p_i = (i - l_i)(r_i - i - 1)\)
  • 若删去 \([1,l_i - 1]\)\([r_i + 1,n]\) 的某个位置, \(p_i = (i - l)(r - i)\)
  • 若删去 \(r_i\) 这个点,记 \(rr_i\)\(r_i\) 右边第一个小于 \(a_i\) 的位置, \(p_i =(rr_i - i - 1)(i - l_i)\)
  • 若删去 \(l_i\) 这个点,记 \(ll_i\)\(l_i\) 右边第一个小于 \(a_i\) 的位置, \(p_i=(r_i-1)(i-ll_i-1)\)

前四种可以简单通过数据结构维护,如差分,线段树等。后两种 st 表上二分即可。

做这个题的时候除了 st表上二分其他都想到了(

posted @ 2024-07-26 11:25  你说得太对辣  阅读(28)  评论(0)    收藏  举报