构造
1. [AGC030C] Coloring Torus
- 注意到若(k leq 500),可以直接第(i)行放(i)
- 突破口:否则的话,我们注意到这个矩阵在行和列上都是循环同构的,所以我们考虑把这个矩阵斜着过来看,即把每个对角线当成一行,注意到对角线有(2 * n - 1)条,但因为是循环同构的,可以把(r + c equiv i(mod n))都看作第(i)条,这样便有(n)条,每条长度为(n)
- 每一条对角线都可以交替着放两个数字,那么一个可以放(2 * n = 1000)个数字,可以通过本题
2. [AGC027D] Modulo Matrix
- 考虑不妨令(m = 1)
- 考虑将格子黑白染色,每个黑格子取两个质数相乘,那么白格子就确定了,为黑格子的(lcm + 1)
- 黑格子要按两条对角线的质数集相乘还是要按照横竖的质数集相乘呢,注意到这种相邻问题与对角线更强相关,上面那题也是利用这点,所以用对角线的质数集相乘即可,注意调整质数顺序(不要让大的乘大的)
3. [AGC025D] Choosing Points
- 简单题,先阐述一个引理(我也不会证明)
- 整点在平面上能构成的正多边形只有正方形
- 设全局整点集合为(U)
- 于是若将平面内距离等于(sqrt{D})的点连边,那么得到的是二分图
- 我们考虑将该二分图黑白染色,注意到二分图(假设点数为(n))最大独立集(ge frac{n}{2}),我们可以先将(U)按照(sqrt{D1})连边得到二分图,选择较大的独立集(T)(这个不需要跑二分图算法,只需要黑白染色),然后再把(T)按(sqrt{D2})连边,同理最后得到的点数(ver ge frac{(2*n)^2}{4} ge n^2)符合题意
4. CF1270E Divide Points
- 也不算很难吧,考虑将格点黑白染色,以下我们要证明一个引理
- 以任一整点(o)为圆心,任意长(r)为半径,画圆,则圆上任意整点距离(r)的曼哈顿距离的奇偶性相同
(proof)
[egin{aligned}
&(a^2 + b^2) = (c^2 + d^2)(1)\
&(a + b)^2 equiv a^2 + b^2(mod 2)(2)\
ightarrow&(a + b)^2 equiv(c + d)^2(mod 2)\
ightarrow&(a + b) equiv (c + d)(mod 2)
end{aligned}]
证明完毕
- 那么考虑将格点黑白染色,黑色的点分为一组,白色的点分为一组,那么一定不会出现某两个离白点距离相同的点一个是黑点一个是白点之类的不合法情况
- 但如果所有点颜色相同呢(?),我们要求不能两组都不能为空,我们注意到,若只保留一种颜色的点,并将整个坐标系旋转(45 angle),那么便得到一个和原问题一样的子问题,递归下去即可
5. AGC017E Jigsaw
- 巧妙的构造
- 注意到若左边的(c_i != 0),那么必须要有一个(d_i = 0)且(b_i = c_i)的拼图放在其左边才合法.右边同理.
- 我们考虑以此建图
- 注意到(n)非常大,(H)却很小,我们考虑建立(2 * H)个点,对于左边的部分,若(c_i = 0)则建一个新点(a_i),否则建一个新点(c_i + H),对于右边,若(d_i = 0),建一个新点(b_i + H),否则建新点(d_i),这样就能互相匹配,把拼图视为边,即把左边部分的点向右边部分的点连一条有向边,那么我们即要求把整张图划成若干个路径,要求每一条边恰好经过一次且,起点(leq H),终点(> H)
- 我们可以考虑建一个超级点,给起点分配若干条边,从终点收回若干条边,那么就可以构造欧拉回路使得每条边经过一次
- 根据欧拉回路的构造条件,我们可以得到一张图合法的充要条件
- ((1))对于(leq H)的点,入度必须小于等于出度
- ((2))对于(> H)的点,出度必须小于等于入度
- ((3))对于每个连通块,都至少要有一个点入度小于出度,一个点入度小于出度
- ((4))新连入的边的数目要等于新连出的边
- 其实((4))可以忽略,注意到原来总入度便等于总出度,欧拉回路的总入度也等于总出度,所以((4))是一定满足的
- 同理((3))只要有一个点出度入度不相等即可
- 注意判一下压根没出现过的点
6. [AGC037D] Sorting a Grid
- 我们倒过来考虑
- 我们定义如果一个元素最后在(i)行(j)列,就称它属于第(i)行,第(j)列
- 考虑(C)是什么样的,注意到(C)的每一行所有元素都应该属于这一行
- 接下来考虑(B)是什么样的,即(B)的每一列的(N)个元素都要属于不一样的行
- 接下来考虑(A)如何变到(B),考虑到此时对于(B)来说,我们只关心它属于哪个行,不关心列的信息,于是可以把(N*M)个元素变成(N)种元素,每种(M)个,考虑二分图匹配,把元素当成左端点,列数当作右端点,一列一列的匹配,相当于我们要找(M)个边集不相交的完美匹配,注意到这是一张(M-)正则图,一定有完美匹配,匹配完一列就把这列的边集删掉,删掉后仍有完美匹配,做(M)次匈牙利算法即可
- 时间复杂度(O(n^4))
博弈论
1. 树上删边游戏(FJOI2013圆形游戏)
- 题意简述:给你一棵树,小(A)和小(B)每次可以选一条边删掉,只保留和根联通的部分,不能操作的输,问先手是否必胜
- 结论:(SG_u = oplus_{v in son(u)}(SG_v + 1))
- 考虑归纳证明:我们考虑一颗多叉树事实等价于若干个只有一个儿子的树的(Nim_Game),根据(SG)定理,(SG_u = oplus_{v in son(u)}(SG'_v))
- 其中(SG'_v)表示的是(u + Tree_v)构成的树的(SG)值
- 那我们即证若(u)只有一个儿子(v),那么(SG_u = SG_v + 1)
- 考虑归纳,假设这个定理对于总边数(leq K)时成立,现在有(K + 1)个边,我们如果把((u,v))删了,那么后继为(0),否则若我们把(v)子树中任意一子树的边删了,
此时总边数(leq K),假设此时(SG_v)的后继为(P),根据归纳假设,则(SG_u)的后继为(P + 1),又因为(SG_v)的后继必然取遍(0.....SG_v - 1)(因为(SG_v = mex{所有后继的SG})),所以(SG_u)的后继必然取遍({0 + 1....SG_v - 1 + 1} = {1.....SG_v})再加上之前的(0),可得(SG_u = SG_v + 1),证明完毕
2. CF1149E Election Promises
- 非常巧妙的构造和博弈论
- 考虑这么一个构造,我们定义(val_u = mex_{(u,v) in E}{val_v})
- 令(h_x = oplus_{val_u = x}v_u)
- 结论:先手必败当且仅当(forall x,h_x = 0)
- (proof)
- ((1)),必败态任意后继都是必胜态,这个是显然的
- ((2)),必胜态一定可以到必败态,我们考虑(mx = max{S},S = {x|h_x != 0}),其中必然有一个点(u),满足(h_x oplus v_u < v_u)并且(val_{u} = mx),我们考虑我们可以通过降低(v_u)使得(h_x = 0),然后我们可以遍历其所有后继(y),若存在(h_{val_y} = 0),我们可以直接修改(v_y)使其(= 0),注意此处不一定满足(v_y oplus h_{val_y} < v_y),但是题目允许的是任意修改,不一定要降低,所以仍然可行.
- 突破口,为何我们要如此定义(val_y),就是方便接下来不重不漏的遍历所有后继分成的组