干完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(nlg^2 n))。但实际上如果把节点视作时间维,那可以直接线段树上二分,时间(O(nlg n))。
时间开5s随便过。
E
https://www.cnblogs.com/jz-597/p/14423340.html
让我的寒假从这场rating+0的CF开始吧。