Codeforces Round #684 (Div. 1)

场上在意识到B会带一个log时果断弃掉去开C,事后证明这是个明智的选择

A

顺序填,转化为处理\(2\times 2\)的情况,手玩一下能很简单推出

B

每次删掉度数最小的点删掉,若其\(\ge K\)的点可以判断情况\(1\)
对于找到\(K\)的团,按上面删的同时,若度数最小的点度数为\(k-1\)可以把这\(k\)个点拉出来判断一下,用map来判断邻边
度数\(\ge k-1\)的点有\(O(\frac{m}{k})\)个,每次判断时间复杂度为\(O(k^2logn)\)
总复杂度\(O(mklogn)\),观察到有效的\(k\)\(O(\sqrt{m})\)级别的

C

观察1:操作1影响的是一段连续区域,产生的效果是赋值
观察2:操作二只会选取\(O(logV)\)段区间消费
以上操作均可用线段树维护,时间复杂度\(O(nlognlogV)\)

D

\(dp1_{i}\)\(i\)个座位\(i\)个人的合法方案数,考虑枚举最后一个人的座位,发现两边的位置的转移是独立的

\[dp1_{i}=\sum\limits_{j=1}^i [j+(i-j+1)]{i-1\choose j-1}dp1_{j-1}dp1_{i-j} \]

\(dp2_i\)\(i\)个座位\(i\)个人的合法方案的疯狂程度之和,考虑枚举最后一个人的座位,单独算其疯狂度,前\(i-1\)个人的疯狂度考虑增量

\[dp2_{i}=\sum\limits_{j=1}^i ({j\choose 2}+{i-j\choose 2}){i-1\choose j-1}dp1_{j-1}dp1_{i-j}+[j+(i-j+1)]{i-1\choose j-1}(dp2_{j-1}dp1_{i-j}+dp2_{i-j}dp1_{j-1}) \]

\(dp3_{i,j}(i>j)\)\(i\)个座位\(j\)个人的合法方案数,考虑枚举最长的全部被占用的后缀长度\(l\)
\(l=0\),则方案数为\(dp3_{i-1,j}\);否则,由于第\(n-l\)个座位是空的,所以两边的位置也是独立的

\[dp3_{i,j}=dp3_{i-1,j}+\sum\limits_{l=1}^j {j\choose l}dp3_{i-l-1,j-l}\cdot dp1_{l} \]

\(dp4_{i,j}(i>j)\)\(i\)个座位\(j\)个人的合法方案的疯狂程度之和

\[dp4_{i,j}=dp4_{i-1,j}+\sum\limits_{l=1}^j {j\choose l}(dp4_{i-1-l,j-l}\cdot dp1_{l}+dp3_{i-1-l,j-l}dp2_l) \]

实际上,这个问题可以做到\(O(nlogn)\),但是parking and tree这套理论我不太懂,所以暂时先咕了

E

结论0:将有效点看作节点,两点之间有边的充要条件为两点均为有效点且相邻。那么图构成了一棵树。

证明:
对于有效点\((0,?),(?,0)\)这类的点,会形成一个边框框柱上边界与左边界
对于有效点\((x,y)(x,y\ge 1)\),考虑最低的\(1\),易得\((x-1,y)(x,y-1)\)有且仅有一个点有效

结论1:令点\((0,0)\)的深度为\(0\),有效点\((x,y)\)的深度为\(x+y\)

根据上面的证明易得

容易发现这是翻硬币游戏的拓展版本
考虑单个点的SG函数
结论2:有效点\((x,y)\)的SG函数等于\(2^{dep}\)

对深度施归纳易得

那么对深度为\(dep\)的点操作一次,等价于游戏的SG函数异或上\(2^{dep+1}-1\)
可以发现最小操作次数就是游戏的SG函数,在二进制下的段数

对于\(x_1,y_1,x_2,y_2\)所造成的影响一定是一段连续区间为\(1\),可以通过求lca判断
如何求lca呢?通过结论1的证明能发现,每次往上爬是不断对最低位\(1\)最小的一维\(-1\)
通过对位处理,可以\(O(logV)\)求得lca

终于更完了,撒花✿✿ヽ(°▽°)ノ✿
吐槽一下官方题解比我更都慢...

posted @ 2020-11-18 20:22  Grice  阅读(179)  评论(0编辑  收藏  举报