CF1368G Shifting Dominoes
把骨牌的移动看成是空格子的移动,显然一个空格子不管怎么移动它的横纵坐标的奇偶性不变
这就启发我们对格子黑白染色,白色区域的空格子只会移动到白色区域,黑色区域的空格子只会移动到黑色区域。那么猜想,删除一个骨牌过后,两个空格子的移动互不干扰。
我们对空格子的移动建边 ( x , y ) (x,y) (x,y) 表示空格子可以从 x x x 移动到 y y y 。可以发现每个格子的入度 ≤ 1 \le 1 ≤1 ,把格子看成点,整个图是一个基环(外向)树森林。
手玩一下发现不会有环,感性理解 显然不会有环。那么整个图就是外向树森林。
只要一对格子可以被两个组成一个骨牌的格子移动到,那么就算 1 的贡献。即对于两个结点,存在两个祖先满足他们组成多米诺骨牌的两个格子,那么就算 1 的贡献。
这个问题可以转化为一个矩阵面积并的问题。考虑将每一对点 ( x , y ) (x,y) (x,y) ,将其对应到平面上的点 ( d f n x , d f n y ) (dfn_x,dfn_y) (dfnx,dfny) ( d f n i dfn_i dfni 为 i i i 结点的 d f s dfs dfs 序)。现在枚举每一块骨牌,如果是由编号为 x x x 和 y y y 的树上的结点所对应的方格组成,那么就将 x x x 的子树所对应的区间作为 x x x 轴的范围, y y y 的子树对应的区间最为 y y y 轴的范围,给这样组成的矩形中的所有点覆盖。通过一共覆盖的点数量即可算出答案。覆盖点数只需要使用扫描线求解即可。
CF1466H Finding satisfactory solutions
题解 orz orz 扑通扑通跪下来
(您们会吗 反正我不会我只会看题解
CF1148G Gold Experience
连边的条件 ( x , y ) (x,y) (x,y) 满足 g c d ( x , y ) ≠ 1 gcd(x,y)\not=1 gcd(x,y)=1
这个条件不好处理,取它的补图,那么补图中连边 ( x , y ) (x,y) (x,y) 满足 g c d ( x , y ) = 1 gcd(x,y)=1 gcd(x,y)=1
一个子图合法满足 要么每个点度数 ≥ 1 \ge1 ≥1 ,要么每个点度数 = 0 =0 =0 。
考虑一个构造方法:
先拿出三个点,满足之间有两条边(这样可以随时删除一个点,就能细微调整集合大小
在剩下的点的集合中,将度数为 0 0 0 的点删去,再剩下的点就是一个合法的集合
接下来我们只需要通过删点,把集合大小缩小至 k k k 即可。设 f ( r ) f(r) f(r) 表示这个集合前 r r r 个点,度数不为 0 0 0 的点有几个。
二分一个 m i d mid mid ,满足 f ( m i d − 1 ) + 3 < k ≤ f ( m i d ) + 3 f(mid-1)+3<k\le f(mid)+3 f(mid−1)+3<k≤f(mid)+3 。
意思是在前 m i d − 1 mid-1 mid−1 个点中,有 f ( m i d ) − f ( m i d − 1 ) − 1 f(mid)-f(mid-1)-1 f(mid)−f(mid−1)−1 个是和 m i d mid mid 相连,删去 f ( m i d ) − f ( m i d − 1 ) − 1 f(mid)-f(mid-1)-1 f(mid)−f(mid−1)−1 中的部分点,使得剩下的度数 > 0 >0 >0 的点个数为 k k k 或 k + 1 k+1 k+1 。
以上操作后为什么可能会删到 k + 1 k+1 k+1 而删不到 k k k 呢?因为当和 m i d mid mid 相连的点删完了,此时 m i d mid mid 度数就 = 0 =0 =0 了,所以不能把和 m i d mid mid 相连的点删完。
最后是 k + 1 k+1 k+1 的话,就删除刚开始拿出的三个点中的一个即可。
CF1240F Football
奇奇怪怪的构造题
一个好理解的随机算法:
考虑 K = 2 K=2 K=2 时的解法,加一个虚点0,连向度数为奇数的点使每个点度数为奇数,求出这张图的欧拉回路,并给路径上的边挨个染色 1 , 2 , 1 , 2 , 1 , . . . 1,2,1,2,1,... 1,2,1,2,1,... ,这样就构造出了一种方案。(每个点入一次就出一次,所以染了入边颜色为 1 1 1 紧接着就出边为 2 2 2 。删除虚点0后依旧合法。
考虑 K > 2 K>2 K>2 ,先随机给边染色,一个不合法的点 x x x ,把 m a x x max_x maxx 的颜色和 m i n x min_x minx 的颜色拿出来用 K = 2 K=2 K=2 的方法染色
更巧妙的神奇算法:(p_b_p_b yyds 扑通扑通跪下来
这种题看着就觉得应该是构造一个方案使得所有边都在里面。
考虑拆点拆成二分图,对于原图的边 ( x , y ) , x < y (x,y),x<y (x,y),x<y,变成新图的 ( x , y + n ) (x,y+n) (x,y+n) 。
尝试给新图染色,使得每个点的极差不超过1。这样显然合并之后也还是合法的。
对于一个新图的点,若 d e g = x K + y ( y < K ) deg=xK+y(y<K) deg=xK+y(y<K) ,则再把它拆成 x + 1 x+1 x+1 个点。此时我们尝试让每个点连 出去的边的颜色互不相同。
每次新加一条边 ( x , y ) (x,y) (x,y) 。如果有一种颜色可以同时满足x和y就直接加入,否则设x的一种合法颜色是1, y的一种合法颜色是2。
先让这条边的颜色为2,然后对y说,我要把这条边变成1。
那么y就会对原先它的1边的终点说,我要把这条边变成2。
以此类推,发现这样不会走出环。如果出环那么可以发现原来的方案不合法,这显然是矛盾的。
CF487E Tourists
元方树模板,略。
CF750H New Year and Snowy Grid
问题等价于两点之间最小割是否大于等于 2 。
平面图转对偶图,把格子看成点,把障碍看成黑点,问题就变成了:能否再染黑一个格子,使得左下和右上联通。
具体怎么实现呢,预处理出每一对可以用过染黑一个点合并的原始连通块,把k个点染黑后,枚举与左下联通的原始联通块再枚举与左下联通的原始联通块,看间能否再染一个点使得连通。 k k k 很小,可以暴枚。
CF798E Mike and code of a permutation
万能的线段树爱了爱了
暴力:强行建图,跑拓扑排序。
考虑如何优化建图:
记 b i b_i bi 表示 i i i 被 谁mark 了。没有的a和置为n+1。从题中得到两种小于关系
- ( i , b i ) (i,b_i) (i,bi)
- ( j , i ) , j ∈ [ 1 , a i − 1 ] , b j > i , j ≠ i (j,i),j\in[1,a_i−1],b_j>i,j≠i (j,i),j∈[1,ai−1],bj>i,j=i
第二种关系可以用线段树快速得到一个点的一个前驱(维护区间内 b j b_j bj 最大的 j j j 。 i i i 的一个前驱就是 [ 1 , a i − 1 ] [1,a_i−1] [1,ai−1] 中 b j b_j bj 最大的 j j j 。
然后采用dfs的拓扑排序的方法:从一个点开始,把它的所有出边都删掉,然后 dfs 它的 前驱。
删边相当于在线段树中把自己删掉,找前驱也可以在线段树中找,于是就 O ( n log n ) O(n\log n) O(nlogn) 了。
其实这道题可以拓展的,本质就是考的边数很大时 快速找前驱dfs的拓扑排序的方法。
CF843D Dynamic Shortest Path
感觉很多难题都喜欢考常见算法的本质(wow wow 底层逻辑居然这么重要
比如这道题,就是用队列来替代dj常用的堆
我们常用的dj堆里面存的是 ( x , d ) (x,d) (x,d) ,表示到 x x x 点的距离为 d d d 。改用队列存放就是 在 d d d 的队列中放入 x x x 点,跑dj的时候由小到大取来跑就可以了。在值域小的时候,时间可以做到线性。
这道题,我们每个修改操作都要更新一次 1 到每个点的最短路。我们把新的最短路减原始最短路的差当作关键字来跑dj,用队列维护,因为这个差很小,所以单次更新复杂度可以做到 O ( n + m ) O(n+m) O(n+m) 。总复杂度 O ( q ( n + m ) ) O(q(n+m)) O(q(n+m)) 。
(怎么感觉时间很卡呢2333
LOJ3057 「HNOI2019」校园旅行
暴力:把所有初始合法的点对丢进队列,然后暴力枚举两边往同色点走, O ( m 2 ) O(m^2) O(m2) 。
接下来考虑怎么把无用的边删去。
把边分成连接同色边或连接异色边的两种。
一对合法点对要想走异色边来找新的合法点对时两边应该分别是:“黑->白”,“黑->白”;或者“白->黑”,“白->黑”;
如果一边是 “黑->白”,另一边是 “黑->白->黑->白->黑->白”。其实最终到达的两个点也是合法点对,因为边可以重复走,而异色边构成的连通块一定是二分图所以留一颗生成树就行了。
对于同色连通块,如果是二分图,保留一颗生成树。因为一侧的点到另一侧的步数一定是奇数,而由于可以重复走同一条边,我们不关心其步数,只关心其奇偶性,生成树上的点与点之间奇偶性不变。
对于同色连通块,如果不是二分图,保留一颗生成树并任挑一个点加上一个自环。因为点与点之间奇数步可达,偶数步也可达,加一个自环可以调奇偶性。
最后在建出来的新图上跑暴力, O ( n 2 ) O(n^2) O(n2) 。
LOJ2493 「BJOI2018」染色
手玩题,有意思,膜拜现场把所有情况都模出来的大佬。
显然非二分图一定会被叉(比如每个点都是可选的颜色都是 ( a , b ) (a,b) (a,b)
然后二分图 有两个不相交的环,也一定会被叉掉。因为我们可以用一个环强制某个点选某种颜色。
显然只有一个环或者没有环,我们是叉不了的。
最后就是手模出来的结论:
-
m ≥ n + 2 m \ge n + 2 m≥n+2 的时候,肯定能被叉
-
m = n + 1 m = n + 1 m=n+1 的时候,如果只存在一个双联通分量的话,取出这个双联通分量,存在两个点点度为3,他们之间有3条路径,如果其中两条为2的话就叉不了,不然就能叉掉
然后没有别的情况了,于是就做完了,大结论题。
AGC051D C4
占坑,一定补。
(呜呜呜怎么就我不会生成树计数啊嘤嘤