bzoj 2303 Apio2011 方格染色

2022-03-01 16:42:35 字數 1425 閱讀 1484

很神奇的思路,膜一發大佬

設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 #include2

const

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表示不同 一開始賦初值都表示為相同 然後每次更新並查集時...