BZOJ2303 [Apio2011]方格染色 并查集
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ2303
题意概括
现在有一个N*M矩阵,矩阵上只能填数字0或1
现在矩阵里已经有一些格子被填写了数字,询问是否存在一种填写方案使得「任意一个2*2的矩阵异或和为1」,输出方案总数
题解
我们发现当我们已经确定(1,1)的颜色为1的时候:
我们知道c(i,j)。
那么如果i和j都是偶数,那么就有c(1,1)^c(i,1)^c(1,j)^c(i,j)==1
否则就是0。
因为假设s(i,j)表示以i,j为左上角的2*2矩阵异或起来,那么:
S(1,1)^S(1,2)^...^S(1,j)^S(2,1)^S(2,2)^...^S(i-1,j-1)=c(1,1)^c(i,1)^c(1,j)^c(i,j)。
而左式就等于(i-1)*(j-1)个1异或。
这是一个好东西。
然后我们枚举(1,1)的颜色,然后对于每一个C(i,j)就可以得到一组C(i,1)和C(1,j)的关系。
但是当i=1或者j=1的时候,是得到一个C(i,1)或者C(1,j)的答案。
最后得到关系之后,只需要看看是否矛盾。
然后统计连通块数,就是自由元的总数,每一个自由元有2种取值,于是答案显而易见。
注意输入有i=j=1的情况要特判。
细节有点多。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int N=1000005,mod=1e9;
int n,m,ad,k,v[N*4],fa[N*4];
struct color{
int a,b,c;
}co[N];
int Turn(int a,int b){
return a==1?(b-1):(a-1+m-1);
}
int getf(int k){
return fa[k]==k?k:fa[k]=getf(fa[k]);
}
int solve(){
memset(v,-1,sizeof v);
for (int i=1;i<=ad*2;i++)
fa[i]=i;
for (int i=1;i<=k;i++){
int a=co[i].a,b=co[i].b,c=co[i].c;
if (a==1&&b==1)
continue;
if (a==1||b==1){
v[Turn(a,b)]=c,v[Turn(a,b)+ad]=c^1;
continue;
}
int A=Turn(a,1),B=Turn(1,b);
int res=(!(a&1)&&!(b&1))^c;
if (res){
if (getf(A)==getf(B))
return 0;
fa[getf(A)]=getf(B+ad);
fa[getf(B)]=getf(A+ad);
}
else {
if (getf(A)==getf(B+ad))
return 0;
fa[getf(A)]=getf(B);
fa[getf(A+ad)]=getf(B+ad);
}
}
for (int i=1;i<=ad*2;i++){
if (v[i]==-1)
continue;
if (v[getf(i)]==-1)
v[getf(i)]=v[i];
else if (v[getf(i)]!=v[i])
return 0;
}
int res=1,ans=0;
for (int i=1;i<=ad*2;i++)
if (getf(i)==i&&v[i]==-1)
ans++;
for (ans>>=1;ans--;)
res=res*2%mod;
return res;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
ad=n+m-2;
int flag=-1;
for (int i=1;i<=k;i++){
scanf("%d%d%d",&co[i].a,&co[i].b,&co[i].c);
if (co[i].a==1&&co[i].b==1)
flag=co[i].c;
}
int ans1=solve();
for (int i=1;i<=k;i++)
if (co[i].a>1&&co[i].b>1)
co[i].c^=1;
int ans2=solve();
int ans=0;
if (flag==-1)
ans=(ans1+ans2)%mod;
else
ans=flag?ans2:ans1;
printf("%d",ans);
return 0;
}
BZOJ2303 [Apio2011]方格染色 并查集的更多相关文章
- 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]方格染色 【并查集】
Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 ...
- 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 ...
随机推荐
- ubuntu新建组合用户命令不管用
当我们新建了组和用户的时候发现一些命令不管用了,这是什么问题呢. 一.解决方案. 通过以下命令添加组和用户,切换到新用户,发现命令不管用,只有一个$符号. groupadd 新组名 ----添加组 u ...
- 2018秋寒假作业6- -PTA编程总结3
PTA3抓老鼠啊~亏了还是赚了?思路: 首先定义变量并初始化为零,然后用if-else语句判断其关系和计算奶酪数量及盈利情况.
- 【IT界的厨子】酱香鲈鱼
食材: 前世曾经回眸的鲈鱼一条(主要选刺少的鱼,适合孩子吃,大人吃随意,草鱼比较大) 五花肉少许(肥一些的) 豆腐 辅料: 葱姜 蒜(选) 大料 香菜 调味: 啤酒(两罐) 黄豆酱或豆瓣酱(选) 老抽 ...
- B. Array
题目链接:http://codeforces.com/contest/224/problem/B 具体大意: 输入n,m. 给你一个区间,让你找某一段区间中包含m个不同的数,并且这段区间中的某一个小区 ...
- HashMap、ArrayMap、SparseArray分析比较
http://blog.csdn.net/chen_lifeng/article/details/52057427
- Spring 注解<context:annotation-config> 和 <context:component-scan>的作用与区别
<context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过packagesanning的方式)上面的注解 ...
- weblogic中部署SSH项目遇到的坑
总结将SSH项目部署到weblogic遇到的坑.项目中是SSH,另外还用到了webservice.quartz等框架.在tomcat部署是可以的,现在总结部署到weblogic遇到的坑. 在这里说一下 ...
- SpringBoot整合Jdbc
(1).添加相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
- Windows和Mac上NodeJS和Express的安装
一.安装NodeJS,官网上下载,https://nodejs.org/en/ 直接下一步安装就行了. 打开命令行工具,输入 node -v 则会出现node的版本,则成功了. 下面我们介绍如何安装e ...
- AT91RM9200---电源管理控制器(PMC)介绍
1.前言 PMC通过集成的两个OSC(一个主振荡器和一个慢时钟振荡器32.768khz)和两个PLLs产生系统所有的clock. PMC提供时钟给嵌入式处理器,并通过在IDLE模式下停止处理器时钟,直 ...