bzoj 2303 Apio2011 方格染色

2022-02-27 09:24:08 字數 2361 閱讀 3361

傳送門

sam和他的妹妹sara有乙個包含n × m個方格的**。她們想要將其的每個方格都染成紅色或藍色。

出於個人喜好,他們想要**中每個2 × 2的方形區域都包含奇數個(1 個或 3 個)紅色方格。例如,右圖是乙個合法的**染色方案(在列印稿中,深色代表藍色,淺色代表紅色) 。 

可是昨天晚上,有人已經給**中的一些方格染上了顏色!現在sam和sara非常生氣。不過,他們想要知道是否可能給剩下的方格染上顏色,使得整個**仍然滿足她們的要求。如果可能的話,滿足他們要求的染色方案數有多少呢? 

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

之後的k行描述已被染色的方格。其中第 i行包含三個整數$x_$, $y_$和$c_$,分別代表第 i 個已被染色的方格的行編號、列編號和顏色。$c_$為 1 表示方格被染成紅色,$c_$為 0表示方格被染成藍色。 

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

對於所有的測試資料,$2 ≤ n, m ≤ 10^6,0 ≤ k ≤ 10^6,1 ≤ x_ ≤ n,1 ≤ y_ ≤ m$。

窩是不會做去看題解的哇……

空灰冰魂

這位大佬講得比較清晰。

思路大約是確定第一行第一列以後其他點都可以確定。

然後對於一組

$$a_⊕a_⊕a_⊕a_=1$$

它可以化成$$a_⊕a_⊕a_⊕a_=f(x,y)$$

f(x,y)=(x&1)|(y&1)

如果有修改在第一行第一列的,我先跑一遍bfs全染出來,再並查集處理那些等於和不等關係。

#include#include

#include

#define s (!((p[i].x|p[i].y)&1))

#define mn 2100000

using

namespace

std;

intread_p,read_ca,read_f;

inline

intread()

struct bib[mn];

struct nap[mn];

const

int mod=1e9;

int n,m,k,mmh=0

,c[mn],fa[mn],w[mn],l[mn],num;

bool

v[mn],gg;

inline

void

in(int x,int y,int z)

inline

void dfs(int x,int

c)int gf(int

x)inline

void add(int x,int y,int

c)else fa[x]=y,w[x]=c^w[x]^w[y];

//printf("%d %d %d %d %d %d %d %d\n",x,y,w[x],w[y],x,y,c,gg);

}inline

void work(int

x)

else

if (p[i].x==1)

else

if (p[i].y==1)

else

in(p[i].y,p[i].x-1+m,p[i].c^x^s),in(p[i].x-1+m,p[i].y,p[i].c^x^s);

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

if (c[i]!=-1&&!v[i]) dfs(i,c[i]);

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

if (p[i].x!=1&&p[i].y!=1) add(p[i].y,p[i].x-1+m,p[i].c^x^s)/*

,printf("%d %d %d\n",p[i].y,p[i].x-1+m,p[i].c^x^s)*/;

if (gg) return

;

int mmh=1

;

for (int i=2;i<=n+m-1;i++)

if (c[i]==-1&&fa[i]==i) mmh+=mmh,mmh-=mmh>=mod?mod:0

; mmh+=mmh;mmh-=mmh>=mod?mod:0

;

//printf("%d %d\n",x,mmh);

}int

main()

view code

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