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\)个人的合法方案数,考虑枚举最后一个人的座位,发现两边的位置的转移是独立的
令\(dp2_i\)为\(i\)个座位\(i\)个人的合法方案的疯狂程度之和,考虑枚举最后一个人的座位,单独算其疯狂度,前\(i-1\)个人的疯狂度考虑增量
令\(dp3_{i,j}(i>j)\)为\(i\)个座位\(j\)个人的合法方案数,考虑枚举最长的全部被占用的后缀长度\(l\)。
若\(l=0\),则方案数为\(dp3_{i-1,j}\);否则,由于第\(n-l\)个座位是空的,所以两边的位置也是独立的
令\(dp4_{i,j}(i>j)\)为\(i\)个座位\(j\)个人的合法方案的疯狂程度之和
实际上,这个问题可以做到\(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
终于更完了,撒花✿✿ヽ(°▽°)ノ✿
吐槽一下官方题解比我更都慢...