bzoj2303洛谷3631 異或推理 並查集

2021-08-07 07:41:02 字數 1440 閱讀 8978

首先發現,如果我們把藍色看作1,把紅色看作0(不過紅配藍什麼的真的醜….),那麼對於每乙個格仔a(i,j),都有:a(i,j)^a(i+1,j)^a(i,j+1)^a(i+1,j+1)=1

那麼只要第一列和第一行確定了如何染色,整個**的染色就確定了。(這是顯然的,因為乙個2∗

2 的格仔中有三個被染色了,剩下的格仔顏色已定。)

現在我們把上面那個式子記作s(i,j),則我們對於每乙個(i,j),求一次s(1,1)^s(1,2)^…^s(i-1,j-1),這個過程數學感不好的人(比如本蒟蒻),就要崩潰了。不過我們可以形象的想一想,相當於在乙個i∗

j 的格仔中用一塊2∗

2 的小毯子不停地移位覆蓋,那麼被蓋了偶數次的乙個a(x,y),就會發生a(x,y)^a(x,y)=0這樣的事故,而0^0=0,0^1=1,所以就相當於消除了。那麼被蓋了奇數次的格仔只有a(1,1),a(i,1),a(1,j)和a(i,j),因此,a(1,1)^a(i,1)^a(1,j)^a(i,j)在i和j均為偶數的時候(此時(i

−1)∗

(j−1

) 是奇數,s的異或字首和是1)為1,否則為0.

那麼我們可以列舉a(1,1)的值,然後因為a(i,j)的值和a(1,1)的異同關係,a(i,1)和a(1,j)的異同關係可以確定,用帶權並查集維護所有有關係的點a(i,1)或a(1,j),然後有多少個集,答案就有2的多少次方的貢獻。當然還要注意一點,有些集因為題目給出的條件所以已經確定了所有元素是1還是0,所以這些集對答案的貢獻是1不是2.

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

ll mod=1000000000;

const

int n=100005;

int n,m,t;

int x[n],y[n],w[n],f[n<<1],bj[n<<1],d[n<<1];

ll ans;

int find(int x)

ll work()

else

if(d[x[i]]^d[y[i]+n]^w[i]==1)return

0;//判斷可行性

}for(i=1;i<=n+m;++i)if(find(i)==i&&bj[i]==-1)re=(re<<1)%mod;//注意取模

return re;

}int main()

if(flag==-1||flag==0)ans+=work();

if(flag==-1||flag==1)

ans%=mod//注意取模

printf("%lld",ans);//我是不是很可愛啊qwq?

return

0;}

BZOJ 2303 方格染色 (並查集 數學相關)

time limit 20 sec memory limit 256 mb submit 2309 solved 879 submit status discuss sam和他的妹妹sara有乙個包含n m個方格的 她們想要將其的每個方格都染成紅色或藍色。出於個人喜好,他們想要 中每個2 2的方形區...

洛谷 2420 讓我們異或吧

題目描述 異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上...

洛谷 3907 圈的異或 題解

部落格觀賞效果更佳 給定乙個無向圖,點數和邊數 50 50 5 0 但你完全珂以當成2e5 2e52e 5來做 邊有邊權,判斷這個圖是否每個環的邊權的異或和都是000。暴力找每個環,根據dfs dfsdf s序維護異或和,然後用字首和維護這個環的異或和,判斷是否為0 00即珂。首先維護dfs dfs...