h , w h,w h,w分别整除 H , W H,W H,W时无解。
否则任意取一个 d ( d ≤ 4000 ) d(d\leq 4000) d(d≤4000)且 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 −(hw−1)d−1,其余位置填 d d d。
这样满足每个 h w hw hw子矩阵和为 − 1 -1 −1,且总和 > 0 >0 >0
在序列 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(1≤i≤n)交换,求最少操作次数使得操作后 a i = b i ( 1 ≤ ≤ n + 1 ) a_i=b_i(1\leq \leq n+1) ai=bi(1≤≤n+1)
只考虑 a i ≠ b i a_i \neq b_i ai̸=bi的位置,类似于置换问题,离散化权值后 a i → b i a_i\to b_i ai→bi连边。
a n s = ans= ans=总边数+连通块个数-1
正确性:
考虑一个连通块内相当于边数条置换,最少操作次数即边数——每次将一条边的终点放在 a n + 1 a_{n+1} an+1,去与这条边的起点位置交换, a n + 1 a_{n+1} an+1变成了这条边的起点,同时又是下一条边的终点…
不同连通块之间的转换还需要多一次的操作。
妙,倒序考虑:
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 n≤400所以可以对于每个乌龟维护一个不能挂的集合 b z i bz_i bzi(集合里除 i i i以外的点都需要在指定的轮时挂),倒着遍历一遍操作,如果有一次选项中两端都不能挂,那么这个点肯定活不到最后。
最后 n 2 n^2 n2枚举点对 ( x , y ) (x,y) (x,y),首先这两个点都必须能够活到最后,然后在判断这个它们的不挂集合是否有交集,有交集表示一个乌龟挂了两次,当然误解了。
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,2∈s或 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 U→T随意连边
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。