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=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f; } #define P 1000000000 #define N 100010 int n,m,k,fa[N<<2],color[N<<2]; 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,0,sizeof(color));for (int i=1;i<=(n+m-2<<1);i++) fa[i]=i;for (int i=1;i<=k;i++)if (a[i].x!=1&&a[i].y!=1)if ((a[i].c==c)^(((a[i].x-1)&1)*(a[i].y-1)&1)) fa[find((a[i].x-1<<1)-1)]=find((n+a[i].y-2<<1)-1),fa[find(a[i].x-1<<1)]=find(n+a[i].y-2<<1);else fa[find((a[i].x-1<<1)-1)]=find(n+a[i].y-2<<1),fa[find(a[i].x-1<<1)]=find((n+a[i].y-2<<1)-1);int cnt=0;for (int i=1;i<=n+m-2;i++) if (find((i<<1)-1)==find(i<<1)) return 0;for (int i=1;i<=k;i++){if (a[i].x==1&&a[i].y==1){if (a[i].c!=c) return 0;}else{if (a[i].y==1){if (color[find((a[i].x-1<<1)-a[i].c)]!=-1) color[find((a[i].x-1<<1)-a[i].c)]=1;else return 0;if (color[find((a[i].x-1<<1)-(a[i].c^1))]!=1) color[find((a[i].x-1<<1)-(a[i].c^1))]=-1;else return 0;}if (a[i].x==1){if (color[find((n+a[i].y-2<<1)-a[i].c)]!=-1) color[find((n+a[i].y-2<<1)-a[i].c)]=1;else return 0;if (color[find((n+a[i].y-2<<1)-(a[i].c^1))]!=1) color[find((n+a[i].y-2<<1)-(a[i].c^1))]=-1;else return 0;}}}for (int i=1;i<=(n+m-2<<1);i++)if (find(i)==i&&!color[i]) cnt++;cnt>>=1;int ans=1;while (cnt--) ans=(ans<<1)%P;return ans; } int main() { #ifndef ONLINE_JUDGEfreopen("bzoj2303.in","r",stdin);freopen("bzoj2303.out","w",stdout);const char LL[]="%I64d\n"; #elseconst char LL[]="%lld\n"; #endifn=read(),m=read(),k=read();for (int i=1;i<=k;i++) a[i].x=read(),a[i].y=read(),a[i].c=read();cout<<(solve(0)+solve(1))%P;return 0; }
转载于:https://www.cnblogs.com/Gloid/p/9560839.html
BZOJ2303 APIO2011方格染色(并查集)相关推荐
- BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
- python方格染色_Luogu P3631 [APIO2011]方格染色
思路 对于这道题,我们从题目里可以知道,蓝色代表的方块为0,红色代表的方块为1.按照题目要求,如果换一种说法,那就是对于一个2*2的方格,其中1的个数必定有奇数个,这样的话,每个方格里的所 有数的异或 ...
- AT2675 [AGC018F] Two Trees (构造+二分图染色+并查集)
description 戳我看题目 solution 正解说是欧拉回路,但是于私而言非常难懂,如果有兴趣可以看香香mm的博客 定义一个点如果有偶数个儿子,就为奇点:如果有奇数个儿子,就为偶点 对于一个 ...
- [APIO2011] 方格染色
设a[i,j]=0/1表示格子的颜色,由题意,f(i,j)=a[i,j]^a[i+1,j]^a[i,j+1]^a[i+1,j+1]=1. 对于约束a[x,y]=c(x>1,y>1), ^^ ...
- E - Ginger的染色(并查集 + 轮换序列)
主要是判断该序列中有无元素个数为奇数的轮换序列,可以用并查集来找,这里另外写一种方法 ACcode // #pragma GCC optimize (2) // #pragma G++ optimiz ...
- BZOJ 2303: [Apio2011]方格染色 题解
题目大意: 有n*m的方格,中间的数要么是1,要么是0,要求任意2*2的方格中的数异或和为1.已知一部分格子中的数,求合法的填数的方案数. 思路: 由题意得:a[i][j]^a[i][j+1]^a[i ...
- 4075. 染色 并查集的运用 并查集运用的小细节
题目 题解思路 这题思路还是比较明显的,将颜色需要相同的气球全部并查起来,在搜索集合中颜色最多的颜色,将其他的也染成这个.这样贪心就能保证使用的染色最少. 时间复杂度为On,看起来这样复杂很高,实际上 ...
- CF1444C Team-Building(可持久化并查集)(二分图)
解析 容易想到补集思想,寻找那些组之间不能形成二分图 二分图一般的两个判定方法: 染色 并查集 这里考虑并查集(看题解似乎染色也可做) 先把所有组内的边合并并查集 如果某个组自己内部就有奇环,显然不能 ...
- BZOJ 2303 方格染色(带权并查集)
要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...
- 专题突破三之并查集Ⅱ——星球大战,In Touch,方格染色,Junk-Mail Filter,关押罪犯,Silver Woods,Must Be Rectangular!
文章目录 [JSOI2008]星球大战 In Touch 方格染色 Junk-Mail Filter [NOIP2010 提高组] 关押罪犯 Silver Woods Must Be Rectangu ...
最新文章
- hdu 5366 简单递推
- 设置网络映射后,电脑重启后自动重连
- 【Hisi音频】Hi3520D音频输出调试
- kafka监控linux脚本,zabbix监控kafka
- 利用python去除红章
- 如何关闭SAP Fiori的病毒扫描设置
- 如何选择和计算滤波电容?--电容使用详述
- 《城邦暴力团》:一部奇书、反书、隐书
- UVa OJ 128 - Software CRC (软件CRC)
- Linux ubuntu对于cmake的版本更新
- 这三个Offer,你怎么选?
- 开源应自由!Apache、OpenStack 基金会权威回应美国出口管制
- vue+webpack项目打包后背景图片加载不出来问题解决
- 学习C语言中的位操作
- C++实现均值滤波器和中值滤波器
- Kettle下载安装教程
- flash动画转html5 效果,一键把SWF转HTML5 canvas动画的工具-Fanvas
- 中国石油大学《安全行为学》第三阶段在线作业
- KGB知识图谱能够为公司分析上市影响因素
- pip设置默认为清华镜像
热门文章
- linux计划任务 没30s_一分钟学会电脑Linux系统和Windows另类的关机方法,6到飞起来...
- python列表的应用与实例_python列表生成式应用案例
- asp打开exe执行本地程序._ASP.NET Core json配置文件
- 比较两个字符数组是否相等_Java比较两个数组是否相等(equals())
- 澎湖师傅共制巨型“米龟” 延续两岸“乞龟”祈福民俗
- Android开发之——依赖冲突Program type already present
- wordpress主题实现彩色标签云效果
- 怎样在photoshop中快速批量,修改图片
- nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
- 柯洁放言力拼AlphaGo:我抱有必死的信念!(全部细节都在这里)