這題太神了
首先我們可以發現只有當i和j都是偶數時a[1][1]^a[1][j]^a[i][1]^a[i][j]=1才滿足情況,其它時都為0
所以我們可以先把i和j都為偶數的地方^1變為0
下面才是最牛逼的地方,並查集的應用在這裡體現的淋漓盡致。
0表示相同 1表示不同
一開始賦初值都表示為相同
然後每次更新並查集時只要更新他到根所有的數異或起來就是他與根的關係
由於根的g一定為0,所以此時得到的還有它實際應該是多少
我們假設一種比較複雜的情況
我們只有a[1][j]^a[i][1]^a[i][j]=0才成立!
假設此時a[i][j]的值為1(題目給出)
所以當且僅當a[1][j]與a[i][1]顏色不同時才成立
假設此時i到根異或起來為1,j到根異或起來為0
也就是說i與根顏色不同,j與根顏色相同
那麼我們把兩根合併時兩根關係應該是什麼?
相同對不對!
我們又發現此時分於兩樹時a[1][j]^a[i][1]^a[i][j]也為0(1^0^1=0)
結果一樣對不對!
仔細想想其實他是因為異或滿足的三角關係
於是乎很輕鬆的解決了
by:大奕哥
1 #include2using
namespace
std;
3const
int n=2e6+5,mod=1e9;
4 typedef long
long
ll;5
struct
nodea[n];
8int
n,m,k,fa[n],g[n];
9int
get(int
x)10
16ll calc()
1727
else
if(tmp)return0;
28}29int ans=0;30
for(int i=1;i<=n+m;++i)
3139}40
}41return
ans;42}
43int
main()
4451
if(!((a[i].x|a[i].y)&1))a[i].z^=1;52
}53 ll ans=0;54
if(flag==-1||flag==0)ans=calc();
55if(flag==-1||flag==1
)61 ans%=mod;
62 printf("
%lld\n
",ans);
63return0;
64 }
BZOJ2303 Apio2011 方格染色
sam和他的妹妹sara有乙個包含n m個方格的 她們想要將其的每個方格都染成紅色或藍色。出於個人喜好,他們想要 中每個2 2的方形區 域都包含奇數個 1 個或 3 個 紅色方格。例如,右 圖是乙個合法的 染色方案 在列印稿中,深色代 表藍色,淺色代表紅色 可是昨天晚上,有人已經給 中的一些方格染上...
bzoj 2303 Apio2011 方格染色
傳送門 sam和他的妹妹sara有乙個包含n m個方格的 她們想要將其的每個方格都染成紅色或藍色。出於個人喜好,他們想要 中每個2 2的方形區域都包含奇數個 1 個或 3 個 紅色方格。例如,右圖是乙個合法的 染色方案 在列印稿中,深色代表藍色,淺色代表紅色 可是昨天晚上,有人已經給 中的一些方格染...
bzoj 2303 Apio2011 方格染色
很神奇的思路,膜一發大佬 設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 同...