AGC033 题解
AtCoder Grand Contest 033
A - Darker and Darker
跑个多源最短路就好了。由于边权都为
时间复杂度:
code
B - LRUD Game
容易发现,
举个例子,如果第一个人最终想让棋子从上边出去,那么他肯定会一直 U,然后第二个人会一直 D。
四个方向都判一遍就好了。
时间复杂度:
code
C - Removing Coins
先转化一下题意:每个人可以选择一个点然后删掉以这个点为根的叶子节点。
换句话说,每个人可以选择无根树的一个叶子节点(或者都不选)不被删掉,然后把剩余的叶子节点都删掉。
先考虑一条链的情况:
设链的长度为
对于一般情况,发现每次操作可以选择把直径长度减
时间复杂度:
code
D - Complexity
显然有种很朴素的时间和空间都会炸掉的
容易发现答案的上界只有
不妨设枚举的答案为
设
每当
横着切:这种比较 easy,直接转移即可:
竖着切:首先有一种朴
不过有种
这样
当
时间复杂度:
code
E - Go around a Circle
不失一般性,假设 R,那么显然不可能出现连续两个弧上都是 B。
考虑把 B 看成分割符后把整个圆分段,然后寻找其它限制。
如果 R,那么就没别的限制了,直接 dp 就行了(dp出来其实就是个斐波那契数列)。(可以参考代码)
否则,R,一段 B,一段 R,一段 B……
考虑如果一种染色方案存在一段弧上有偶数个 R,那么这种方案一定不合法,因为容易发现这段弧上相邻两点到弧的两端最短距离的奇偶性不同。
然后考虑棋子的运动过程:首先有一段 R,显然这段 R 结束的时候棋子需要在一个红色弧和蓝色弧的交界处,这会对圆上每段 R 的长度产生限制。然后是一段 B,容易发现棋子只要在那条 B 的弧上来回走就行。接着是又一段 R,如果这一段长度为偶数,那么还是来回在一条 R 的弧上来回走就好了;如果长度为奇数,那么就需要到现在所在的 R 段的另一端,显然这段弧的长度不能超过 R 的长度,否则就走不过去了,这又会对圆上每段 R 的长度产生限制。后面的情况类似。
注意如果 R,那么最后的那段 R 就无需考虑了。
知道了圆上每段 R 最长是多少后,就可以 dp 了。令 B 时,前
注意由于圆就算旋转后相同也算不同方案数,所以还需要根据最后一段 R 的长度来决定起点所在位置的方案数。(细节见代码)
code
F - Adding Edges
如果是强制必须按
如果一条边
(u,v) 满足(u,v)\in G 但(u,v)\notin G_0 ,那么一定存在k 个点t_1,\cdots,t_k ,满足u=t_1,v=t_k 且\forall 1\leq i<n ,(t_i,t_{i+1})\in G_0 。
为了化成这种情况,考虑如果某条链上的三个点
考虑分别维护以第
设
假设现在要把一条边
首先要把
然后尝试更新
最终枚举以每个点为边的一个端点的边的数量即可。
具体方法就是在
最终别忘了把答案除以
标记的总点数最多只有
code