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)&1。也就是说,确定第一行和第一列的颜色,就可以确定整个矩阵。现在如果没有已填的格子的限制,答案就是2n+m-1。
然后考虑已填格子。假设固定了a1,1,那么其影响到的就是a1,j和ai,1。即要求两者相同或不同。于是可以把每个格子的染色情况拆成两个点,根据已填格子将其连边,同一连通块内的点只要选择一个就必须全部选择。那么方案数就是2连通块个数/2。注意特判第一行或第一列格子已填的情况。
细节比较麻烦,写完也不知道自己在干啥。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define P 1000000000
#define N 100010
int n,m,k,fa[N<<],color[N<<];
struct data{int x,y,c;
}a[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int solve(int c)
{
memset(color,,sizeof(color));
for (int i=;i<=(n+m-<<);i++) fa[i]=i;
for (int i=;i<=k;i++)
if (a[i].x!=&&a[i].y!=)
if ((a[i].c==c)^(((a[i].x-)&)*(a[i].y-)&)) fa[find((a[i].x-<<)-)]=find((n+a[i].y-<<)-),fa[find(a[i].x-<<)]=find(n+a[i].y-<<);
else fa[find((a[i].x-<<)-)]=find(n+a[i].y-<<),fa[find(a[i].x-<<)]=find((n+a[i].y-<<)-);
int cnt=;
for (int i=;i<=n+m-;i++) if (find((i<<)-)==find(i<<)) return ;
for (int i=;i<=k;i++)
{
if (a[i].x==&&a[i].y==){if (a[i].c!=c) return ;}
else
{
if (a[i].y==)
{
if (color[find((a[i].x-<<)-a[i].c)]!=-) color[find((a[i].x-<<)-a[i].c)]=;else return ;
if (color[find((a[i].x-<<)-(a[i].c^))]!=) color[find((a[i].x-<<)-(a[i].c^))]=-;else return ;
}
if (a[i].x==)
{
if (color[find((n+a[i].y-<<)-a[i].c)]!=-) color[find((n+a[i].y-<<)-a[i].c)]=;else return ;
if (color[find((n+a[i].y-<<)-(a[i].c^))]!=) color[find((n+a[i].y-<<)-(a[i].c^))]=-;else return ;
}
}
}
for (int i=;i<=(n+m-<<);i++)
if (find(i)==i&&!color[i]) cnt++;
cnt>>=;
int ans=;while (cnt--) ans=(ans<<)%P;
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2303.in","r",stdin);
freopen("bzoj2303.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),k=read();
for (int i=;i<=k;i++) a[i].x=read(),a[i].y=read(),a[i].c=read();
cout<<(solve()+solve())%P;
return ;
}
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]方格染色 【并查集】
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 下面才是最 ...
- 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 ...
随机推荐
- C#/JS AES字符串加密和解密
往往我们有一种需求:在页面端实现对即将传入到后台端的某些字符串进行加密,然后在后台端对传入进来的字符串做解密.在一些有安全要求的数据传输上会用到此种方式 下面分别列出js端和后台端的加密或解密代码. ...
- 搞个组装机:D
时间:2016年7月 主机:就是主机 整机:主机+显示器 推荐:自己组装,淘宝或者京东,或者去淘宝上的宁美国度.攀升兄弟看看. 4000多块配个电脑: 处理器:i5 4590 散片(发热量小) 111 ...
- html样式表格
<html><body><table border="1"> <tr height="20px"> &l ...
- 20155301 Exp6 信息搜集与漏洞扫描
20155301 Exp6 信息搜集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点 (4 ...
- Python基础(list和tuple)可变集合和‘不可变’集合
list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...
- POJ3278&&1426&&3126&&3087&&3414
接上次的,标签是BFS专题 其实无论是Deepth还是Breadth都是Search 3278 又是撸过的题目 1426 找一个十进制数(我刚开始看样例以为是二进制数),使得它每一位上都是1或0,且是 ...
- TMS320VC5509驱动AT24C02
1. 刚开始的波形不太对,比如如下代码 i2c_status = I2C_write( at24c02_write_buf, //pointer to data array , //length of ...
- [UOJ#276][清华集训2016]汽水[分数规划+点分治]
题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...
- 2017qq红包雨最强攻略
这个只支持苹果手机,而且要有苹果电脑,只有苹果手机是不行的. QQ红包规则:只要你到达指定的位置,就可以领取附近的红包,一般也就几毛,还有几分的,当然也不排除有更高的,只不过我是没遇到... 那么既然 ...
- Kafka API: TopicMetadata
Jusfr 原创,转载请注明来自博客园 TopicMetadataRequest/TopicMetadataResponse 前文简单说过"Kafka是自描述的",是指其broke ...