P3631 APIO2011 方格染色

2022-06-13 20:42:15 字數 1442 閱讀 7981

p3631 apio2011方格染色

異或性質+帶權並查集維護

主要是異或性質, 題目要求每個\(2\ast2\)的矩形內異或值為1

在使用\(2\ast2\)的矩形異或的時候,考慮對於乙個矩形,除了最外面一圈,內部的格仔都會被異或四次,除了內部和四個頂點的格仔會被異或兩次,所以可以不考慮(同乙個值異或兩次等於不異或),只用考慮四個頂點,那麼考慮矩形 \((a,b)(a,c)(b,d)(c,d)\)

我們可以得到

在矩形長寬均為偶數的情況 \(1 = val_ \bigoplus val_ \bigoplus val_ \bigoplus val_\)

在矩形長寬均為偶數的情況 \(0 = val_ \bigoplus val_ \bigoplus val_ \bigoplus val_\)

更進一步,對於已知兩個頂點的矩形,我們可以知道剩下兩個點是否相同。

那麼我們令 \(a = 1, b = 1\) 來做此題。

然後列舉 \(val_\) 的值,就行了。

取0和取1是相反的狀態,直接給k個確定點取反就行了。

注意:

if ((!(x[i] & 1)) && (!(y[i] & 1)))
以上**是為了統一評判標準。

#include #include #include using namespace std;

typedef long long ll;

const ll maxn = 1e6+10;

const ll mod = 1e9;

ll n, m, k, x[maxn], y[maxn], k[maxn], g[maxn], fa[maxn];

ll calc(ll);

ll find_(ll);

ll kuaisu(ll, ll);

int main()

if (x[i] == 1 && y[i] == 1)

}if (-1 != flag) else

return 0;

}ll calc(ll opt)

}for (ll i = 1; i <= n + m; i++) fa[i] = i, g[i] = 0;

fa[n+1] = 1;

for (ll i = 1; i <= k; i++) else if (tp) }}

ll tot = 0;

for (ll i = 1; i <= n + m; i++)

return kuaisu(2, tot-1) % mod;

}ll kuaisu(ll n, ll tim)

tim >>= 1;

n = n * n % mod;

}return ret;

}ll find_(ll x)

return q;

}

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