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一下就 ...
随机推荐
- AI 系列 总目录
AI 系列 答应了园区大牛 张善友 要写AI 的系列博客,所以开始了AI 系列之旅. 一.四大平台系列(百度AI.阿里ET.腾讯.讯飞) 1.百度篇 (1) 百度OCR文字识别-身份证识别 (2) 基 ...
- 【java设计模式】【创建模式Creational Pattern】建造模式Builder Pattern
package com.tn.pattern; public class Client { public static void main(String[] args) { Director dire ...
- 二叉树Binary_Tree(1):二叉树及其数组实现
定义 二叉树: 二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递归定义是:二叉树要么为空,要么由根结点.左子树 ...
- HTTP Live Streaming 直播(iOS直播) 初识
HTTP Live Streaming(HLS)技术,并实现了一个HLS编码器HLSLiveEncoder,当然,C++写的.其功能是采集摄像头与麦克风,实时进行H.264视频编码和AAC音频编码,并 ...
- linux下PHP后台配置极光推送问题
一.composer.json配置注意空格 按照极光推送官网所述,在composer.json下写入: "require": { "jpush/jpush": ...
- 1-MySQL数据库(android连接MySQL数据库)
很好的链接 http://www.cnblogs.com/best/p/6517755.html 一个小时学会MySQL数据库 http://www.cnblogs.com/klguang/p/47 ...
- Spring任务调度之Quartz集成
推荐一个博客:http://blog.csdn.net/column/details/14251.html 基本概念 Job:是一个接口,只有一个方法void execute(JobExecution ...
- 点击盒子选中里面的单选框,并给盒子添加相应样式,美化单选框、复选框样式css用法,响应式滴
pc效果图: 移动端效果图: 代码直接上: <!DOCTYPE html> <html> <head> <meta http-equiv="Cont ...
- Java设计模式之(一)------单例模式
1.什么是单例模式? 采取一定的办法保证在整个软件系统中,单例模式确保对于某个类只能存在一个实例.有如下三个特点: ①.单例类只能有一个实例 ②.单例类必须自己创建自己的实例 ③.单例类必须提供外界获 ...
- css div 细边框
.item{ max-width:48%; float:left; padding:2px; border-top:1px solid #000; border-left:1px solid #000 ...