BZOJ2303 Apio2011 方格染色

2021-07-24 14:08:37 字數 1564 閱讀 3327

sam和他的妹妹sara有乙個包含n × m個方格的

**。她們想要將其的每個方格都染成紅色或藍色。

出於個人喜好,他們想要**中每個2 ×   2的方形區

域都包含奇數個(1 個或 3 個)紅色方格。例如,右

圖是乙個合法的**染色方案(在列印稿中,深色代

表藍色,淺色代表紅色) 。 

可是昨天晚上,有人已經給**中的一些方格染上了顏色!現在sam和sara

非常生氣。不過,他們想要知道是否可能給剩下的方格染上顏色,使得整個**

仍然滿足她們的要求。如果可能的話,滿足他們要求的染色方案數有多少呢? 

輸入的第一行包含三個整數n, m和k,分別代表**的行數、列數和已被染

色的方格數目。 

之後的k行描述已被染色的方格。其中第 i行包含三個整數xi, yi和ci,分別

代表第 i 個已被染色的方格的行編號、列編號和顏色。ci為 1 表示方格被染成紅

色,ci為 0表示方格被染成藍色。 

輸出乙個整數,表示可能的染色方案數目 w 模 10^9得到的值。(也就是說,如果 w大於等於10^9,則輸出 w被10^9除所得的餘數)。 

對於所有的測試資料,2 ≤ n, m ≤ 106

,0 ≤ k ≤ 10^6

,1 ≤ xi ≤ n,1 ≤ yi ≤ m。 

3 4 3

2 2 1

1 2 0

2 3 1

8資料為國內資料+國際資料+修正版

鳴謝gyz

並查集

考慮第一行和第一列 如果已經確定 則所有的都可以確定

(i,j)上的數為xi^yj^(1,1)^(i,j都是偶數)

然後列舉(1,1) 注意特判

用帶權並查集判能否可行 最後答案就是2^(聯通塊個數-1) 因為列舉了1,1這個點

注意是g[x]^=g[f[x]]而不是g[x]^=g[fx]

#includeusing namespace std;

const int maxn=1000010;

const int mod=1e9;

int f[maxn<<1],g[maxn<<1],n,m,k;

struct node

e[maxn];

int findfa(int x)

inline int poww(int x,int y)

return s;

}inline int cal()

int fx=findfa(x),fy=findfa(y);

g[fx]=g[x]^g[y]^e[i].w;

f[fx]=fy;

} int cnt=0;

for(int i=1;i<=n;i++)

if(findfa(i)==i)

cnt++;

return poww(2,cnt-1);

}int w,ans;

int main()

if(!((e[i].x&1)|(e[i].y&1))) e[i].w^=1;

} if(w)

else

cout<}

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 同...

BZOJ2303 APIO2011方格染色

這題太神了 首先我們可以發現只有當i和j都是偶數時a 1 1 a 1 j a i 1 a i j 1才滿足情況,其它時都為0 所以我們可以先把i和j都為偶數的地方 1變為0 下面才是最牛逼的地方,並查集的應用在這裡體現的淋漓盡致。0表示相同 1表示不同 一開始賦初值都表示為相同 然後每次更新並查集時...