最近变成口胡选手了。
CF1209F Koala and Notebook
容易想到把每条边拆成若干个点,使得每条拆后的边是一位数,这样只要分层图就可以保证长度相等。
然后需要字典序最小,直接 BFS 从小往大枚举下一条边扩展,注意相同权值的点要同时扩展。
CF1804F Approximate Diameter
令 $v$ 的偏心距为 $ecc(v) = \max\limits_{u} ( dis_{u,v} )$,则图的半径 $rad$ 为 $\min\limits_{v} ( ecc(v) )$,直径 $dia$ 为 $\max\limits_{v} ( ecc(v) )$。
注意到对于任意点 $u$,有 $ecc(u) \leq dia \leq 2 \times ecc(u)$,所以考虑从任意点(例如 $1$)开始 bfs 求出它的 $ecc$,就知道了直径的范围。
考虑动态加边的过程中 $dia$ 呈现下降趋势,所以每次加边后 $ecc(1)$ 只要小于 $\lceil \frac{R}{2} \rceil$ 就要重新计算 $R=ecc(1)$。这个可以用二分快速解决,时间复杂度 $O((n+m) \log^2 n)$。
CF325E The Red Button
观察到当 $n$ 为奇数的时候无解,原因是 $0$ 和 $n-1$ 都只能从 $\frac{n-1}{2}$ 转移而来,那么这个点会被经过两次,不合法。
考虑对于 $[0,\frac{n}{2})$ 的数 $i$,令 $i \rightarrow 2i$,$i + \frac{n}{2} \rightarrow 2i+1$。
这样会形成若干个环,发现只要交换这两个数的出边就可以合并两个环。
环用并查集维护即可。
CF1534F1 Falling Sand (Easy Version)
yysy,这题可以直接用 F2 的代码过,甚至 F1 比 F2 难写。
注意到每个点只会影响它所在列、左右列高度 $\leq$ 它的点,所以可以直接向这些点连边。
但空间会爆,所以只需要向它下面第一个点连边就可以了。
接下来缩点跑 Tarjan,求入度为 $0$ 的点的个数即可。
CF1534F2 Falling Sand (Hard Version)
将每列至少落下几个转化为自下而上第几个必须落下。
观察到平面图的性质每个点落下会影响到的列是一个区间。
所以只要对每个特殊点,求出最左边和最右边能影响到它的列即可,最后跑个区间选点问题即可。
CF1515F Phoenix and Earthquake
注意到 $\sum a_i \lt (n-1) \times x$ 则无解。
否则只要能合并就合并,考虑随便选出一棵生成树,从叶子节点往上合并,只要当前节点的权值 $\geq x$ 则直接合并到父亲,否则放在最后合并。
CF1889D Game of Stacks
注意力惊人,注意到如果进入一个环不管从哪里进入最后肯定会回到这个点。
所以这个环相当于没用,可以直接消掉,这个过程可以用 dfs 模拟。
消掉环之后直接在 dfs 内记录答案就做完了。
CF1515G Phoenix and Odometers
首先一个点肯定不能走出 SCC,否则就回不来了。
猜想这和 SCC 内的环有关。
设 SCC 中环的大小分别为 $x_1,x_2,\dots,x_n$,存在 $k_1x_1 + k_2x_2 + \dots + k_nx_n \equiv s \pmod t$ 的条件为 $s$ 是 $\gcd(x_1,x_2,\dots,x_n)$ 的倍数(详见裴蜀定理)。
考虑到有很多 $x_i$ 是不必要的。观察到任意一个环均可以被过 dfs 树上的环表示。
所以在 dfs 树上直接做,求 gcd 即可。
CF1949J Amanda the Amoeba
首先一步重要的转化是:找到一个起点和终点都能到达的中间状态,并分别求起点到中间、终点到中间的方案再合并起来输出。
那么现在的难点就在于如何寻找唯一确定的中间状态。
这是第二步重要的转化:考虑对这张地图进行编号,并把变形虫移动到编号最小的位置。
可以想到对于一个连通块直接用一次 dfs 编号,会产生一个类似于树的结构,这样移动过去显然最终状态是唯一确定的。
那么如何实现移动过程呢?发现移动相当于删除一个点,再添加一个点。
显然,在移动过程中变形虫不能断开,所以删除的不能是割点,而添加的点显然根据贪心是变形虫周围编号最小的点。
那么大致的算法思路就出来了:每次寻找一个编号最大非割点删掉,并在周围寻找编号最小空地添加进变形虫。