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. 批量操作QT UI中的控件

    背景:在一个项目中,可能一个UI中存在大量相同的tablewidget,combobox,label等控件,每种可能有100个,此时想对它们进行同样的操作 方案:(以tablewidget为例,UI中 ...

  2. wamp升级php7

    原文:http://blog.csdn.net/cheng6251/article/details/50730441 1.下载php7   http://windows.PHP.net/downloa ...

  3. 简化Kubernetes应用部署工具-Helm

    [编者的话]微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernete ...

  4. angular2.x 下拉多选框选择组件

    angular2.x - 5.x 的下拉多选框选择组件 ng2 -- ng5.最近在学angular4,经常在交流群看见很多人问 下拉多选怎么做... 今天就随便写的个. 组件源码 百度云   链接: ...

  5. JavaScript权威指南--客户端存储

    客户端存储web应用允许使用浏览器提供的API实现将数据存储在用户电脑上. 客户端存储遵循“同源策略”,因此不同站点的页面是无法读取对于存储的数据.而同一站点的不同的页面之间是可以互相共享存储数据的. ...

  6. js原码工具集

    /* 原生js工具集 */ arr是否包含obj function contains1(arr, obj) { var i = arr.length; while (i--) { if (arr[i] ...

  7. 堆 Heap

    2018-03-01 20:38:34 堆(Heap)是可以用来实现优先的队列的数据结构,而不是堆栈. 若采用数组或者链表实现优先队列 若采用树的结构 如果采用二叉搜索树,那么每次删除,比如删除最大值 ...

  8. JavaScript封装Ajax工具函数及jQuery中的ajax,xhr在IE的兼容

    封装ajax工具函数 首先要思考:1.为什么要封装它?提高开发效率2.把一些不确定的情况考虑在其中 a. 请求方式 b. 请求地址 c. 是否异步 d. 发送参数 e. 成功处理 f. 失败处理3.确 ...

  9. R-模式(mode)和类(class)

    数据模式:mode函数显示任何对象的模式.常见的单个的对象模式是逻辑型(Logical).数值型(Numeric).字符型(Character). 常用到的数据模式是列表(list). 逻辑型:TRU ...

  10. 设计模式--状态模式C++实现

    1定义 当一个状态的内在状态改变时允许其行为改变,这个对象看起来像改变了其类 2类图 角色分析 State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换 ConcreteS ...