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表上二分其他都想到了(
标签:958,位置,Codeforces,最小值,即可,删去,Div From: https://www.cnblogs.com/wyyqwq/p/18324973