【bzoj2303】[Apio2011]方格染色

2015年4月14日2,9131

Description

Sam和他的妹妹Sara有一个包含n × m个方格的
表格。她们想要将其的每个方格都染成红色或蓝色。
出于个人喜好,他们想要表格中每个2 ×   2的方形区
域都包含奇数个(1 个或 3 个)红色方格。例如,右
图是一个合法的表格染色方案(在打印稿中,深色代
表蓝色,浅色代表红色) 。
可是昨天晚上,有人已经给表格中的一些方格染上了颜色!现在Sam和Sara
非常生气。不过,他们想要知道是否可能给剩下的方格染上颜色,使得整个表格
仍然满足她们的要求。如果可能的话,满足他们要求的染色方案数有多少呢?

Input

输入的第一行包含三个整数n, m和k,分别代表表格的行数、列数和已被染
色的方格数目。
之后的k行描述已被染色的方格。其中第 i行包含三个整数xi, yi和ci,分别
代表第 i 个已被染色的方格的行编号、列编号和颜色。ci为 1 表示方格被染成红
色,ci为 0表示方格被染成蓝色。

Output

输出一个整数,表示可能的染色方案数目 W 模 10^9得到的值。(也就是说,如果 W大于等于10^9,则输出 W被10^9除所得的余数)。

对于所有的测试数据,2 ≤ n, m ≤ 106
,0 ≤ k ≤ 10^6
,1 ≤ xi ≤ n,1 ≤ yi ≤ m。

Sample Input

3 4 3
2 2 1
1 2 0
2 3 1

Sample Output

8

HINT

数据为国内数据+国际数据+修正版

鸣谢GYZ

题解

如果确定了第一行,接下来的每一行只会是

变换1.上一行所有奇数列异或1后得到

变换2.上一列所有偶数列异或1后得到

如果没有矛盾,显然答案就是第一行的方案数 * 2^(2到n行空行数)

发现如果同一行的两列若都染色,则这两列的颜色是相互约束的

用个并查集,把同一行的所有列并起来,第一行方案数即确定连通块颜色的方案数

考虑第一行已染色的情况,某连通块某列在第一行已染色,则该连通块颜色确定

最终第一行染色方案为2^(未确定颜色的连通块个数)

判断无解的情况

给定某一行的两列a,b颜色ca,cb,我们就可以得出第一行这两列同色(0)or反色(1)

1.奇偶性相同的列(a mod 2 = b mod 2),第一行a,b列颜色关系为ca ^ cb

2.奇偶性相同的列(a mod 2 <> b mod 2),设第一行到此行进行p1次变换1,p2次变换2

则p1+p2=行号-1

第一行a,b列颜色关系为cx^cy^(行号-1)

用一个并查集判矛盾

只计算方案

AC