比赛:CF2151 Div.2

· · 题解

CF2151 Div.2

A. Incremental Subarray

如果有跨段的情况,答案为 1。否则子数组只在一段内,输出 n-a_{m}+1

Code

B. Incremental Path

考虑继承上一个人的位置,如果上一个人的最后一个操作是 B,那么当前的人就在上一个人的终止位置进行一次 B 操作,然后再进行这个人的最后一次操作。暴力往后跳即可,跳的次数是 O(n) 的。

Code

C. Incremental Stay

- 对于两端的 $(1,n),(2,n-1),\cdots,(k-1,n-(k-1)+1)$ 匹配。 - 对于中间的 $(k,k+1),(k+2,k+3),\cdots,(n-(k-1)-1,n-(k-1))$。 [Code](https://codeforces.com/contest/2151/submission/340165100) ### [D. Grid Counting](https://codeforces.com/contest/2151/problem/D) 这题限制条件都很紧,从题目的条件一步步缩小计数范围即可。 [Code](https://codeforces.com/contest/2151/submission/340179485) ### [E. Limited Edition Shop](https://codeforces.com/contest/2151/problem/E) 赛时不知道为什么想那么久贪心。考虑 DP。 设 $f(i,j)$ 表示 Alice 拿完前 $i$ 个,Bob 拿完前 $j$ 个,之后 Alice 能获得的最大价值。边界是 $f(n,*)=0$,答案为 $f(0,0)$。 考虑 $O(n^2)$ 暴力转移: - $f(i,j)\gets f(i+1,j) + [j<p_{a_{i+1}}]\cdot v_{a_{i+1}}$,其中 $p_i$ 表示 $i$ 在 $b_i$ 中的下标。 - $f(i,j)\gets f(i,j+1)$。 第一个转移是前缀加,第二个转移相当于要维护后缀 $\max$。 如果前缀加一个正数,后缀 $\max$ 不变。 如果前缀加一个负数, - 假设当前是区间 $[1,p)$ 加 $v$,当前后缀 $\max$ 数组为 $f$。对于 $[1,p)$ 中所有满足 $f_i+v\le f_p$ 的位置,相当于要直接赋值为 $f_p$;否则,直接加上 $v$ 不会影响后缀 $\max$ 数组。 因此用线段树 区间加 + 区间赋值 维护即可,找位置可以用线段树二分做到 $O(\log n)$,直接写二分 $O(\log^2n)$ 也能过。 [Code](https://codeforces.com/contest/2151/submission/340212281)