Codeforces Round #700 (Div. 1) 题解&总结 A~E
干完WC之后寒假颓废了两天,靠这场CF来点燃我的假期生活。
事实证明颓废两天也是有代价的,所以这次比赛并不是很有感觉。并且由于是在家也不太习惯,又热,蚊子又多,甚至不太敢大力敲机械键盘。
不过rating加0,看起来也没有亏呢(
A
第一题出交互题……亏我还想了蛮久的。
可以考虑\(doit(l,r)\)表示\([l,r]\)中找到一个局部最小值。这个最小值一定存在,并且\(a_l<a_{l-1},a_r>a_{r+1}\)。
问\(mid,mid+1\),如果\(a_{mid}<a_{mid+1}\),则递归到\(doit(l,mid)\),否则递归到\(doit(mid+1,r)\)。
发现这样操作一定满足存在局部最小值,所以肯定能找出解。
(话说我自己写的时候问的是\(mid-1,mid,mid+1\)……)
B
一开始想到一个贪心,马上敲完之后写个\(O(n^2)\)的DP验证一下发现它果然假了。
后来一直想贪心想不出来,直到我发现这个\(O(n^2)\)DP可以优化。
我的DP是设\(f_{i,j}\)表示处理完前\(i\)个位置,一个子序列末尾为\(a_i\),一个子序列末尾为\(a_j\)的贡献。可以线段树优化。
(似乎和题解的DP不同)
口胡一下题解的贪心(以最大值为例,最小值类似):维护两个序列的末尾\(x,y\),现在加入\(z\)。
- \(x=z\)或\(y=z\),此时把\(z\)加到\(y\)或\(x\)末尾。
- 否则,比较\(nxt(x),nxt(y)\),哪个小就放到哪个后面。\(nxt\)表示相同颜色的下一个。
This strategy is know as Bélády's algorithm or farthest-in-the-future cache/page replacement policy (see here for more information). The complexity is O(n) since we only need to preprocess every element's next occurrence.
扯到高速缓存上去了呢。
C
比赛时不会做。
先把\([L,R]\)变成\([1,R-L+1]\)。
构造。设\(S_i\)表示一个起点,满足出发到达的集合为\([1,2^i]\)。
\(S_0\)直接向终点连。\(S_k\)可以通过复制\(S_{k-1}\)的出边,然后加上边\((S_k,S_{k-1},2^{k-1})\)得到。
得到这堆东西之后类似数位DP一样分成一个个二次幂处理即可。
D
想不出C然后想D,发现很水然后思想切了,比赛最后两分钟交了上去。pretest好多到结束都没有评测完。
最终由于数组开小RE了……
非常显然地这题可以随机化。
用主席树维护。维护\(f(u,r)\)表示节点\(u\)到根路径上,颜色不超过\(r\)的异或和。我把颜色视作时间维,对于每个询问暴力二分,时间\(O(n\lg^2 n)\)。但实际上如果把节点视作时间维,那可以直接线段树上二分,时间\(O(n\lg n)\)。
时间开5s随便过。
E
https://www.cnblogs.com/jz-597/p/14423340.html
让我的寒假从这场rating+0的CF开始吧。