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 ≤ 10^6,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


思路

发现行和行之间是可以相互影响的

进一步发现i行只能在i-1行的基础上把所有奇数列或者偶数列全部异或,所以就可以考虑每一行的数对第一行的影响就可以了

因为每一行都会影响第一行取值的情况,所以把第一行建立并查集。

一个是维护联通关系的普通并查集

一个是维护抑或关系的带权并查集

然后就可以维护了

最后答案是\(2^{第一行联通块个数+没有染色的格子数量}\)


还是看了hwzer学长的blog才会的


#include<bits/stdc++.h>
using namespace std;
#define Mod 1000000000
#define N 1000010
#define LL long long
int n,m,K,tot;
int fa[N],fat[N],g[N];
bool mark[N],vis[N];
vector<int> p[N],col[N];
int fast_pow(LL a,LL b){
LL ans=1;
while(b){
if(b&1)ans=a*ans%Mod;
b>>=1;
a=a*a%Mod;
}
return ans;
}
int find1(int x){
if(x==fa[x])return x;
return fa[x]=find1(fa[x]);}
int find2(int x){
if(x==fat[x])return x;
int tmp=find2(fat[x]);
g[x]^=g[fat[x]];
return fat[x]=tmp;
}
bool merge(int x,int y,int t){
int fx=find2(x),fy=find2(y);
if(fx==fy)return (g[x]^g[y])==t;
fat[fx]=fy;
g[fx]=(g[x]^g[y]^t);
return 1;
}
int main(){
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=m;i++)fa[i]=i,fat[i]=i;
for(int i=1;i<=K;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x==1)vis[y]=1;
mark[x]=1;
p[x].push_back(y);
col[x].push_back(z);
}
for(int i=1;i<=n;i++)
for(int j=1;j<(signed)p[i].size();j++){
int x=p[i][j],y=p[i][j-1];
int cx=col[i][j],cy=col[i][j-1];
int fx=find1(x),fy=find1(y);
fa[fx]=fy;
if(vis[fx])vis[fy]=1;
int t=cx^cy;
if(x%2!=y%2)t=(t^(i-1))&1;
if(!merge(x,y,t)){puts("0");return 0;}
}
for(int i=1;i<=m;i++)if(fa[i]==i&&vis[i]==0)tot++;
for(int i=2;i<=n;i++)if(!mark[i])tot++;
printf("%d\n",fast_pow(2,tot));
return 0;
}

BZOJ2303: [Apio2011]方格染色 【并查集】的更多相关文章

  1. BZOJ2303 [Apio2011]方格染色 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2303 题意概括 现在有一个N*M矩阵,矩阵上只能填数字0或1 现在矩阵里已经有一些格子被填写了数字 ...

  2. BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]

    题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...

  3. [BZOJ2303][Apio2011]方格染色

    [BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...

  4. BZOJ2303 APIO2011方格染色

    这题太神了 首先我们可以发现只有当i和j都是偶数时a[1][1]^a[1][j]^a[i][1]^a[i][j]=1才满足情况,其它时都为0 所以我们可以先把i和j都为偶数的地方^1变为0 下面才是最 ...

  5. BZOJ2303 APIO2011方格染色(并查集)

    比较难想到的是将题目中的要求看做异或.那么有ai,j^ai+1,j^ai,j+1^ai+1,j+1=1.瞎化一化可以大胆猜想得到a1,1^a1,j^ai,1^ai,j=(i-1)*(j-1)& ...

  6. BZOJ_2303_[Apio2011]方格染色 _并查集

    BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...

  7. bzoj 2303: [Apio2011]方格染色【并查集】

    画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...

  8. bzoj 2303: [Apio2011]方格染色

    传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...

  9. 【题解】P3631 [APIO2011]方格染色

    很有意思的一道题,所以单独拿出来了. 完整分享看 这里 题目链接 luogu 题意 有一个包含 \(n \times m\) 个方格的表格.要将其中的每个方格都染成红色或蓝色.表格中每个 \(2 \t ...

随机推荐

  1. CentOs64位编译安装hadoop-2.6.0

    官方提供的hadoop-2.x版本貌似都是32位的,在64位机子下使用可能会报错,最好使用官方提供的源码进行本地编译,编译成适合本地硬件环境的64位软件包. Hadoop是使用Java语言开发的,但是 ...

  2. Java环境搭建指南

    1.1 配置Java环境 1.  下载并安装Jdk1.7或Jdk1.8 http://www.oracle.com/technetwork/java/javase/downloads/index.ht ...

  3. Bigdecimal: Non-terminating decimal expansion; no exact representable decimal result.

    做除法没有指定保留小数点后几位,就会抛出此异常. 因为会除不尽 Non-terminating decimal expansion; no exact representable decimal re ...

  4. mac下安装c++开发环境

    mac下安装c++开发环境 1 注册apple id 按照apple注册步骤注册apple id,我注册时遇到如下问题 apple store完成创建apple id步骤中,选择付款方式和账单地址后, ...

  5. confluence wiki 破解安装操作流程

    准备postgres数据库安装 步骤1:命令: docker pull postgres 步骤2:安装: docker run --name postgresdb -p 5432:5432 -e PO ...

  6. PyCharm在win10的64位系统安装实例

    搭建环境 1.win10_X64,其他Win版本也可以. 2.PyCharm版本:Professional-2016.2.3. 搭建准备 1.到PyCharm官网下载PyCharm安装包. 2.选择W ...

  7. js从数组中随机获取n个不重复的数据

    做云课堂的作业时遇到一要求,实现刷新页面时显示不同数据,(数组中20个据,页面加载10个).思路就是从0-19中随机生成10个不同的数,让数组取下标输出数据. 下面是在num的范围内生成n个不重复的数 ...

  8. navicat for mysql 导入SQL Server显示中文乱码解决办法

    解决方法是在navicat里右击一个连接,选择连接属性,切换到高级选项卡,去掉“使用mysql字符集”前的对勾,在编码里选择utf-8

  9. Oracle recovery manager failed to restore

    解决办法: 1:清理过期失效的备份, 2:增加recovery_file_dest_size参数值即可: SQL> show parameter db_recover NAME          ...

  10. bzoj3600

    题解: 好像是什么替罪羊树 然后看了几个题解 然后就抄了一边 代码: #include<bits/stdc++.h> using namespace std; ; int n,m,rt,R ...