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\)

  1. \(x=z\)\(y=z\),此时把\(z\)加到\(y\)\(x\)末尾。
  2. 否则,比较\(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开始吧。

posted @ 2021-02-08 15:53  jz_597  阅读(160)  评论(0编辑  收藏  举报