Codeforces Round #620 (Div. 2) 题解

A

判断\((a+b)|(y-x)\)即可。

code

B

贪心的枚举互相匹配的前后缀,再寻找剩下的串中是否有合法的可作为中间位置的串即可。

code

C

维护一下当前能到达的温度的最大值和最小值,再和每个人的需求比一下即可。

code

D

发现一串连续的\(<\)已经构成了LIS,那么最长LIS则要求所有的\(<\)能连在一起,最短LIS则要求每段LIS互相独立无法拼接。

可以维护一头一尾两个指针表示值域,\(<\)的使用尾指针,\(>\)的使用头指针,通过控制\(>\)前的元素段与段之间的递增/递减来实现最长LIS/最短LIS间的切换。

code

E

做过CSP-J2019的T4的都应该知道:我们需要求出奇偶性不同的两条最短路长。由于重复经过一条路径只会给最短路带来偶数次影响,所以只能通过走环来强制改变路径的奇偶性。

不强制走环的最短路一定是原树上的最短路,强制走环的话可以考虑强制走加的边\((u,v)\)这样虽然有两种情况但是奇偶性是一致的(画个图证一下就好了)。

code

F1&F2

\(f_{i,j}\)为第\(i\)天,上一天在位置\(j\)架起了照相机的最大值,则有。

\[f_{i,j}=\max(f_{i-1,p}+w(i,p)-\mathrm{intersect}(i,j,p)) \]

其中\(w(i,j)=\sum_{p=j}^{j+k-1}a_{i,p}\), \(\mathrm{intersect}(i,j,p)\)表示\(w(i,j)\)\(w(i,p)\)的相交部分。

F1的话发现\(\mathrm{intersect}(i,j,p)=0\)的部分可以通过预处理前缀/后缀的最大值就可以\(O(1)\)转移,不为\(0\)的部分可以暴力\(O(k)\)转移。

F2的话考虑\(a_{i,j}\)会与\(f_{i-1,j-k+1},f_{i-1,j-k+2},\cdots,f_{i-1,j}\)交叉,是一段区间。于是每一次可以用线段树维护\(f_{i-1,p}-\mathrm{intersect}(i,j,p)\).当枚举的\(j\to j+1\)时,至多只会有两个\(a\)的值的贡献被加上/删去,线段树上直接区间修改即可。

code(F2)

posted @ 2020-03-09 08:16  EncodeTalker  阅读(122)  评论(0编辑  收藏  举报