场上在意识到B会带一个log时果断弃掉去开C,事后证明这是个明智的选择
A
顺序填,转化为处理(2 imes 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,yge 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
终于更完了,撒花✿✿ヽ(°▽°)ノ✿
吐槽一下官方题解比我更都慢...