【Atcoder】AGC016 C-F简要题解

*C.+/- Rectangle

h , w h,w h,w分别整除 H , W H,W H,W时无解。

否则任意取一个 d ( d ≤ 4000 ) d(d\leq 4000) d(d4000) d d d尽量大,比如 d = 3000 d=3000 d=3000,在每一个 ( i h , j w ) (ih,jw) (ih,jw)位置填上 − ( h w − 1 ) d − 1 -(hw-1)d-1 (hw1)d1,其余位置填 d d d

这样满足每个 h w hw hw子矩阵和为 − 1 -1 1,且总和 > 0 >0 >0


D.XOR Replace

在序列 a a a后面加一个 a n + 1 = a 1   x o r   a 2   x o r   . . .   x o r   a n a_{n+1}=a_1\ xor \ a_2\ xor \ ...\ xor \ a_n an+1=a1 xor a2 xor ... xor an b b b同理。

问题转化为:
定义一次操作为 a n + 1 a_{n+1} an+1与任意 a i ( 1 ≤ i ≤ n ) a_i(1\leq i\leq n) ai(1in)交换,求最少操作次数使得操作后 a i = b i ( 1 ≤ ≤ n + 1 ) a_i=b_i(1\leq \leq n+1) ai=bi(1n+1)

只考虑 a i ≠ b i a_i \neq b_i ai̸=bi的位置,类似于置换问题,离散化权值后 a i → b i a_i\to b_i aibi连边。

a n s = ans= ans=总边数+连通块个数-1

正确性:
考虑一个连通块内相当于边数条置换,最少操作次数即边数——每次将一条边的终点放在 a n + 1 a_{n+1} an+1,去与这条边的起点位置交换, a n + 1 a_{n+1} an+1变成了这条边的起点,同时又是下一条边的终点…

不同连通块之间的转换还需要多一次的操作。


*E.Poor Turkeys

妙,倒序考虑:

x x x能一直活下去的条件必然是在所有与它有关的选择 ( x , y ) (x,y) (x,y)中都是 y y y挂了,同时也意味着 y y y在这轮之前都不能挂,也就是说之前和它有关的所有选择 ( y , x ′ ) (y,x') (y,x)都是 x ′ x' x挂了…

不断推下去,发现因为 n ≤ 400 n\leq 400 n400所以可以对于每个乌龟维护一个不能挂的集合 b z i bz_i bzi(集合里除 i i i以外的点都需要在指定的轮时挂),倒着遍历一遍操作,如果有一次选项中两端都不能挂,那么这个点肯定活不到最后。

最后 n 2 n^2 n2枚举点对 ( x , y ) (x,y) (x,y),首先这两个点都必须能够活到最后,然后在判断这个它们的不挂集合是否有交集,有交集表示一个乌龟挂了两次,当然误解了。


*F.Games on DAG

s g →   m e x   → sg\to\ mex\ \to sg mex 分层状压转移(枚举子集)

问题本质上就是求 G ′ G' G满足 s g 1   x o r   s g 2 ≠ 0 sg_1\ xor \ sg_2\neq 0 sg1 xor sg2̸=0的个数。

补集转化,求 s g 1 = s g 2 sg_1=sg_2 sg1=sg2的方案数,因为是 s g sg sg游戏,所以可以枚举 m e x mex mex

d p s dp_s dps表示点集 s s s( 1 , 2 ∈ s 1,2\in s 1,2s 1 , 2 ∉ s 1,2\notin s 1,2/s)的方案数,枚举子集 T T T,设 T T T关于 s s s的补集为 U U U。假设 U U U集合 s g = 0 sg=0 sg=0 T T T集合 s g > 0 sg>0 sg>0,考虑转移:

U U U集合内部无连边
U → T U\to T UT随意连边
T T T中每个点到 U U U至少有一条连边
T T T内部的方案数= d p T dp_T dpT

转移意义相当于多了一层 U U U使得原本 T T T集合的所有点 s g sg sg值整体+1。

你可能感兴趣的:(妙,状压DP,sg函数,构造,atcoder)