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 ...
随机推荐
- 批量操作QT UI中的控件
背景:在一个项目中,可能一个UI中存在大量相同的tablewidget,combobox,label等控件,每种可能有100个,此时想对它们进行同样的操作 方案:(以tablewidget为例,UI中 ...
- 【转】爬取豆瓣电影top250提取电影分类进行数据分析
一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...
- javascript模块化编写
目录: 1. 开篇语 2. 对象形式写法 3. 立即执行函数写法 4. prototype写法 5. 总结 1. 开篇语 现在我们写代码不再是一个人包办所有的活儿,都是在多人合作的情况下完成的.我们只 ...
- python3安装tensorflow遇到的问题
1. 使用命令:sudo pip3 install --upgrade \ https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow ...
- flask学习(十一):if判断语句
1. 语法: {% if xxx %} {% else %} {% endif %} 2. if的使用,和python中if相差无几 用if判断,当用户名存在且年龄大于18时,才显示用户名和注销
- hdu 4679 Terrorist’s destroy 树的直径+dp
题意:给你一棵树,每条边都有值W,然后问你去掉一条边,令val = w*max(两颗新树的直径),求val最小值~ 做法,先求树的直径,然后算出直径上每个点的最长枝条长度.这样对于每一条边,假如是枝条 ...
- ansible入门一(Ansible介绍及安装部署)
本节内容: 运维工具 Ansible特性 Ansible架构图和核心组件 安装Ansible 演示使用示例 一.运维工具 作为一个Linux运维人员,需要了解大量的运维工具,并熟知这些工具的差异,能够 ...
- iOS自动化探索(八)Mac上的Jenkins安装
安装Jenkins 首先检查是否有Jenkins依赖的java环境 java -version 出现java version "1.8.xx"说明已经安装了java Jackeys ...
- 转:kafka入门
一.基本概念 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计. 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语:Kafk ...
- ZOJ 3696 Alien's Organ(泊松定理,期望值)
Alien's Organ Time Limit: 2 Seconds Memory Limit: 65536 KB There's an alien whose name is Marja ...