bzoj 2303: [Apio2011]方格染色
Description
Sam和他的妹妹Sara有一个包含n × m个方格的表格。她们想要将其的每个方格都染成红色或蓝色。
出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 个)红色方格。例如,右图是一个合法的表格染色方案(在打印稿中,深色代表蓝色,浅色代表红色) 。 
可是昨天晚上,有人已经给表格中的一些方格染上了颜色!现在Sam和Sara非常生气。不过,他们想要知道是否可能给剩下的方格染上颜色,使得整个表格仍然满足她们的要求。如果可能的话,满足他们要求的染色方案数有多少呢?
Input
输入的第一行包含三个整数n, m和k,分别代表表格的行数、列数和已被染色的方格数目。 
之后的k行描述已被染色的方格。其中第 i行包含三个整数$x_{i}$, $y_{i}$和$c_{i}$,分别代表第 i 个已被染色的方格的行编号、列编号和颜色。$c_{i}$为 1 表示方格被染成红色,$c_{i}$为 0表示方格被染成蓝色。
Output
输出一个整数,表示可能的染色方案数目 W 模 10^9得到的值。(也就是说,如果 W大于等于10^9,则输出 W被10^9除所得的余数)。
对于所有的测试数据,$2 ≤ n, m ≤ 10^6,0 ≤ k ≤ 10^6,1 ≤ x_{i} ≤ n,1 ≤ y_{i} ≤ m$。
窝是不会做去看题解的哇……
空灰冰魂这位大佬讲得比较清晰。
思路大约是确定第一行第一列以后其他点都可以确定。
然后对于一组
$$a_{x,y}⊕a_{x-1,y}⊕a_{x,y-1}⊕a_{x-1,y-1}=1$$
它可以化成$$a_{x,y}⊕a_{1,y}⊕a_{x,1}⊕a_{1,1}=f(x,y)$$
f(x,y)=(x&1)|(y&1)
如果有修改在第一行第一列的,我先跑一遍bfs全染出来,再并查集处理那些等于和不等关系。
#include<set>
#include<cstdio>
#include<algorithm>
#define S (!((p[i].x|p[i].y)&1))
#define MN 2100000
using namespace std; int read_p,read_ca,read_f;
inline int read(){
read_p=;read_ca=getchar();read_f=;
while(read_ca<''||read_ca>'') read_f=read_ca=='-'?-:read_f,read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p*read_f;
}
struct bi{int y,z,ne;}b[MN];
struct na{int x,y,c;}p[MN];
const int MOD=1e9;
int n,m,k,MMH=,C[MN],fa[MN],w[MN],l[MN],num;
bool v[MN],gg;
inline void in(int x,int y,int z){b[++num].y=y;b[num].z=z;b[num].ne=l[x];l[x]=num;}
inline void dfs(int x,int c){
if (C[x]!=c&&C[x]!=-) gg=;
if (v[x]) return;
v[x]=;C[x]=c;
for (int i=l[x];i;i=b[i].ne) dfs(b[i].y,c^b[i].z);
}
int gf(int x){
if (x==fa[x]) return x;
int f=fa[x];fa[x]=gf(fa[x]);w[x]^=w[f];
return fa[x];
}
inline void add(int x,int y,int c){
int X=gf(x),Y=gf(y);
if (X==Y){
if (w[x]^w[y]^c) gg=;
}else fa[X]=Y,w[X]=c^w[x]^w[y];
//printf("%d %d %d %d %d %d %d %d\n",x,y,w[x],w[y],X,Y,c,gg);
}
inline void work(int x){
num=;gg=;
for (int i=;i<=n+m-;i++) C[i]=-,fa[i]=i,l[i]=v[i]=,w[i]=;
for (int i=;i<=k;i++)
if (p[i].x==&&p[i].y==){if (p[i].c!=x) return;}
else if (p[i].x==){if (C[p[i].y]==(p[i].c^))gg=;C[p[i].y]=p[i].c;}
else if (p[i].y==){if (C[p[i].x-+m]==(p[i].c^))gg=;C[p[i].x-+m]=p[i].c;}
else in(p[i].y,p[i].x-+m,p[i].c^x^S),in(p[i].x-+m,p[i].y,p[i].c^x^S); for (int i=;i<=n+m-;i++)
if (C[i]!=-&&!v[i]) dfs(i,C[i]); for (int i=;i<=k;i++)
if (p[i].x!=&&p[i].y!=) add(p[i].y,p[i].x-+m,p[i].c^x^S)/*,printf("%d %d %d\n",p[i].y,p[i].x-1+m,p[i].c^x^S)*/; if (gg) return; int mmh=;
for (int i=;i<=n+m-;i++)
if (C[i]==-&&fa[i]==i) mmh+=mmh,mmh-=mmh>=MOD?MOD:;
MMH+=mmh;MMH-=MMH>=MOD?MOD:;
//printf("%d %d\n",x,mmh);
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=k;i++) p[i].x=read(),p[i].y=read(),p[i].c=read();
work();work();
printf("%d\n",MMH);
}
bzoj 2303: [Apio2011]方格染色的更多相关文章
- BZOJ 2303: [Apio2011]方格染色 题解
		
题目大意: 有n*m的方格,中间的数要么是1,要么是0,要求任意2*2的方格中的数异或和为1.已知一部分格子中的数,求合法的填数的方案数. 思路: 由题意得:a[i][j]^a[i][j+1]^a[i ...
 - BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
		
题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
 - bzoj 2303: [Apio2011]方格染色【并查集】
		
画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...
 - [BZOJ2303][Apio2011]方格染色
		
[BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...
 - BZOJ_2303_[Apio2011]方格染色 _并查集
		
BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...
 - BZOJ2303: [Apio2011]方格染色 【并查集】
		
Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 ...
 - 【题解】P3631 [APIO2011]方格染色
		
很有意思的一道题,所以单独拿出来了. 完整分享看 这里 题目链接 luogu 题意 有一个包含 \(n \times m\) 个方格的表格.要将其中的每个方格都染成红色或蓝色.表格中每个 \(2 \t ...
 - 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)& ...
 - [APIO2011]方格染色
		
题解: 挺不错的一道题目 首先4个里面只有1个1或者3个1 那么有一个特性就是4个数xor为1 为什么要用xor呢? 在于xor能把相同的数消去 然后用一般的套路 看看确定哪些值能确定全部 yy一下就 ...
 
随机推荐
- sourceTree git 忽略指定文件
			
按照如下步骤执行(终端命令) 1. git status modified: LovegoMall.xcworkspace/xcuserdata/Tiny.xcuserdatad/xcdebugger ...
 - AMD与CMD区别
			
区别: 1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行.不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同).CMD 推崇 as lazy as ...
 - kvm 随笔
			
1. 查看kvm虚拟机状态 # virsh list --all 2. KVM虚拟机开机 # virsh start windows 3. KVM虚拟机关机或断电 (1) 关机 virsh关机 ...
 - 506. Relative Ranks
			
Given scores of N athletes, find their relative ranks and the people with the top three highest scor ...
 - bzoj 3571: [Hnoi2014]画框
			
Description 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和.对于第 幅画与第 个画框的配对,小T都 ...
 - oracle自动备份_expdp_Linux
			
[oracle@hbsjxtdb1 ~]$ crontab -e 0 4 * * * /backup/script/backupexpdp.sh [oracle@hbsjxtdb1 ~]$ cront ...
 - 类的更新----MVC设计模式
			
<?php class stdObject { public function __construct(array $arguments = array()) { if (!empty($arg ...
 - (转)Linux安装Tomcat
			
为了学习java,需要一个服务器,因此决定用比较流行的tomcat.根据网上对安装tomcat的介绍,自己进行了安装,现在已经成功了,现在把安装的过程进行记录,也供大家学习参考. 一.从官方网站上 ...
 - 如何将外部的obj模型导入OpenGL
			
1.关于obj的说明. obj中存放的是顶点坐标信息(v),面的信息(f),法线(vn),纹理坐标(vt),以及材质(这个放在mtl)中 我使用CINEMA 4D导出用VS查看后的信息: CINEMA ...
 - Vue 爬坑之路(八)—— 使用 Echarts 创建图表
			
在后台管理系统中,图表是一个很普遍的元素.目前常用的图标插件有 charts, Echarts, highcharts.这次将介绍 Echarts 在 Vue 项目中的应用. 一.安装插件 使用 c ...