BZOJ2303: [Apio2011]方格染色 【并查集】
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]方格染色 【并查集】的更多相关文章
- BZOJ2303 [Apio2011]方格染色 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2303 题意概括 现在有一个N*M矩阵,矩阵上只能填数字0或1 现在矩阵里已经有一些格子被填写了数字 ...
- BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
- [BZOJ2303][Apio2011]方格染色
[BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...
- BZOJ2303 APIO2011方格染色
这题太神了 首先我们可以发现只有当i和j都是偶数时a[1][1]^a[1][j]^a[i][1]^a[i][j]=1才满足情况,其它时都为0 所以我们可以先把i和j都为偶数的地方^1变为0 下面才是最 ...
- 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)& ...
- BZOJ_2303_[Apio2011]方格染色 _并查集
BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...
- bzoj 2303: [Apio2011]方格染色【并查集】
画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...
- bzoj 2303: [Apio2011]方格染色
传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...
- 【题解】P3631 [APIO2011]方格染色
很有意思的一道题,所以单独拿出来了. 完整分享看 这里 题目链接 luogu 题意 有一个包含 \(n \times m\) 个方格的表格.要将其中的每个方格都染成红色或蓝色.表格中每个 \(2 \t ...
随机推荐
- Spring cloud + boot 问题记录
1 配置中心更新值的时候,要在有需要更新的属性 类上 加入 @RefreshScope 注解 2 关于Spring Cloud 调用服务 服务名称的问题 spring: applicatio ...
- nginx的坑-org.apache.http.TruncatedChunkException: Truncated chunk( expected size: 7752; actual size: 4077)
org.apache.http.TruncatedChunkException: Truncated chunk 项目中使用请求远程接口报错 ,项目是Spring-boot的,两个项目(A和B) , ...
- Android -- 提交数据到服务器,Get Post方式, 异步Http框架提交
1. 发送请求到服务器有几种方式 (1)HttpURLConnection (2)Httpclient 同步框架 (3)AsyncHttpClient 异步框架 (https://github.com ...
- ORM框架greenDao 2 (用于了解旧版本的使用方法,目前最新版本为3.2.2,使用注释的方式来生成)
摘要: Android中对SQLite数据库使用,是一件非常频繁的事情.现今,也有非常多的SQLite处理的开源框架,其中最著名的greenDao,它以占用资源少,处理效率高等特点,成为优秀的ORM框 ...
- Apache 配置SSL网站
1. 申请证书 现在可以在阿里云或七牛上申请免费的证书,这里以阿里云为例 进入阿里云证书申请界面 https://www.aliyun.com/product/cas ...
- Number.MIN_VALUE常量说明
Number.MIN_VALUE常量说明 Number.MIN_VALUE表示的最小值为5e-324 MIN_VALUE代表的并不是负最小,而是最接近0的一个数 负最小值可以使用-Number.MAX ...
- 第四章 SSL和Proxy高级选项
在前一章,我们已经学习了HTTP消息如何通过Burp Proxy进行拦截和处理,本章我们将继续学习HTTPS协议消息的拦截和处理. HTTPS协议是为了数据传输安全的需要,在HTTP原有的基础上,加入 ...
- (转载) jQuery页面加载初始化的3种方法
jQuery 页面加载初始化的方法有3种 ,页面在加载的时候都会执行脚本,应该没什么区别,主要看习惯吧,本人觉得第二种方法最好,比较简洁. 第一种: $(document).ready(functio ...
- MoreEffectiveC++Item35 条款26: 限制某个class所能产生的对象个数
一 允许零个或一个对象 我们知道每当即将产生一个对象,我们有一个constructor被调用,那么我们现在想组织某个对象的产生,最简单的方法就是将其构造函数声明成private(这样做同事防止了这个类 ...
- 在.NET Core中连接使用Zookeeper
一开始找到的是ZookeeperNetEx,但是很多API都很原始,不怎么好用. 最后确定用Rabbit.Zookeeper来做,他对ZookeeperNetEx进行了封装,要简单不少. 和c语言和j ...