很神奇的思路,膜一發大佬
設s(i,j)=a[i][j]^a[i+1][j]^a[i][j+1]^a[i+1][j+1]。那麼將s(1,1)^s(1,2)^...^s(1,j)^s(2,1)^...^s(2,j)^.....^s(i,j)展開,對於i相同的一行(如s(1,1)^s(1,2)^...^s(1,j)),我們可以先然看出其結果為開頭的a[i][1]^a[i][j],同時其在下一層的異或結果也是a[i+1][1]^a[i+1][j],那麼再把每一行合併,最終我們得到此式的化簡:a[1][1]^a[i+1][1]^a[1][j+1]^a[i+1][j+1],然後當i,j均為奇數時,我們得知a[1][1]^a[i+1][1]^a[1][j+1]^a[i+1][j+1]==1,否則為0,再把那個+1縮掉,即:((i|j)&1)==0時,a[1][1]^a[i][1]^a[1][j]^a[i][j]==1,否則為0.設a[1][1]^a[i][1]^a[1][j]^a[i][j]為z
,再移一下項,我們得到z^a[1][1]^a[i][j]==a[i][1]^a[1][j],然後列舉a[1][1]的值,再用並查集把有關的a[i][1]與a[1][j]連線起來,判斷是否會出現矛盾,如果沒有矛盾,我們就得到了一部分答案。最後把兩個a[1][1]值的貢獻加和即可。
1 #include2const
int n=(int )1e6+5,mod=(int
) 1e9;
3 inline int read(void)9
10int
n,m,k;
11int
x[n],y[n],z[n],g[n],f[n];
12 inline int find(int
x)17 inline int
solve()
18
27int sum=0
;
28for (int i=1;i<=n+m;i++)
29if (f[i]==i)
30if (!sum) sum=1;31
else
35return
sum;36}
37int
main();
39 n=read(),m=read(),k=read();
40for(int i=1;i<=k;i++)
45if(!((x[i]|y[i])&1)) z[i]^=1;46
}47int ans=0;48
if(e[1]) ans=solve();
49if(e[0
])55 printf("
%d\n
",ans);
56 }
//承認抄**。。
BZOJ2303 Apio2011 方格染色
sam和他的妹妹sara有乙個包含n m個方格的 她們想要將其的每個方格都染成紅色或藍色。出於個人喜好,他們想要 中每個2 2的方形區 域都包含奇數個 1 個或 3 個 紅色方格。例如,右 圖是乙個合法的 染色方案 在列印稿中,深色代 表藍色,淺色代表紅色 可是昨天晚上,有人已經給 中的一些方格染上...
bzoj 2303 Apio2011 方格染色
傳送門 sam和他的妹妹sara有乙個包含n m個方格的 她們想要將其的每個方格都染成紅色或藍色。出於個人喜好,他們想要 中每個2 2的方形區域都包含奇數個 1 個或 3 個 紅色方格。例如,右圖是乙個合法的 染色方案 在列印稿中,深色代表藍色,淺色代表紅色 可是昨天晚上,有人已經給 中的一些方格染...
BZOJ2303 APIO2011方格染色
這題太神了 首先我們可以發現只有當i和j都是偶數時a 1 1 a 1 j a i 1 a i j 1才滿足情況,其它時都為0 所以我們可以先把i和j都為偶數的地方 1變為0 下面才是最牛逼的地方,並查集的應用在這裡體現的淋漓盡致。0表示相同 1表示不同 一開始賦初值都表示為相同 然後每次更新並查集時...