比较难想到的是将题目中的要求看做异或。那么有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方格染色(并查集)相关推荐

  1. BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]

    题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...

  2. python方格染色_Luogu P3631 [APIO2011]方格染色

    思路 对于这道题,我们从题目里可以知道,蓝色代表的方块为0,红色代表的方块为1.按照题目要求,如果换一种说法,那就是对于一个2*2的方格,其中1的个数必定有奇数个,这样的话,每个方格里的所 有数的异或 ...

  3. AT2675 [AGC018F] Two Trees (构造+二分图染色+并查集)

    description 戳我看题目 solution 正解说是欧拉回路,但是于私而言非常难懂,如果有兴趣可以看香香mm的博客 定义一个点如果有偶数个儿子,就为奇点:如果有奇数个儿子,就为偶点 对于一个 ...

  4. [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), ^^ ...

  5. E - Ginger的染色(并查集 + 轮换序列)

    主要是判断该序列中有无元素个数为奇数的轮换序列,可以用并查集来找,这里另外写一种方法 ACcode // #pragma GCC optimize (2) // #pragma G++ optimiz ...

  6. BZOJ 2303: [Apio2011]方格染色 题解

    题目大意: 有n*m的方格,中间的数要么是1,要么是0,要求任意2*2的方格中的数异或和为1.已知一部分格子中的数,求合法的填数的方案数. 思路: 由题意得:a[i][j]^a[i][j+1]^a[i ...

  7. 4075. 染色 并查集的运用 并查集运用的小细节

    题目 题解思路 这题思路还是比较明显的,将颜色需要相同的气球全部并查起来,在搜索集合中颜色最多的颜色,将其他的也染成这个.这样贪心就能保证使用的染色最少. 时间复杂度为On,看起来这样复杂很高,实际上 ...

  8. CF1444C Team-Building(可持久化并查集)(二分图)

    解析 容易想到补集思想,寻找那些组之间不能形成二分图 二分图一般的两个判定方法: 染色 并查集 这里考虑并查集(看题解似乎染色也可做) 先把所有组内的边合并并查集 如果某个组自己内部就有奇环,显然不能 ...

  9. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  10. 专题突破三之并查集Ⅱ——星球大战,In Touch,方格染色,Junk-Mail Filter,关押罪犯,Silver Woods,Must Be Rectangular!

    文章目录 [JSOI2008]星球大战 In Touch 方格染色 Junk-Mail Filter [NOIP2010 提高组] 关押罪犯 Silver Woods Must Be Rectangu ...

最新文章

  1. hdu 5366 简单递推
  2. 设置网络映射后,电脑重启后自动重连
  3. 【Hisi音频】Hi3520D音频输出调试
  4. kafka监控linux脚本,zabbix监控kafka
  5. 利用python去除红章
  6. 如何关闭SAP Fiori的病毒扫描设置
  7. 如何选择和计算滤波电容?--电容使用详述
  8. 《城邦暴力团》:一部奇书、反书、隐书
  9. UVa OJ 128 - Software CRC (软件CRC)
  10. Linux ubuntu对于cmake的版本更新
  11. 这三个Offer,你怎么选?
  12. 开源应自由!Apache、OpenStack 基金会权威回应美国出口管制
  13. vue+webpack项目打包后背景图片加载不出来问题解决
  14. 学习C语言中的位操作
  15. C++实现均值滤波器和中值滤波器
  16. Kettle下载安装教程
  17. flash动画转html5 效果,一键把SWF转HTML5 canvas动画的工具-Fanvas
  18. 中国石油大学《安全行为学》第三阶段在线作业
  19. KGB知识图谱能够为公司分析上市影响因素
  20. pip设置默认为清华镜像

热门文章

  1. linux计划任务 没30s_一分钟学会电脑Linux系统和Windows另类的关机方法,6到飞起来...
  2. python列表的应用与实例_python列表生成式应用案例
  3. asp打开exe执行本地程序._ASP.NET Core json配置文件
  4. 比较两个字符数组是否相等_Java比较两个数组是否相等(equals())
  5. 澎湖师傅共制巨型“米龟” 延续两岸“乞龟”祈福民俗
  6. Android开发之——依赖冲突Program type already present
  7. wordpress主题实现彩色标签云效果
  8. 怎样在photoshop中快速批量,修改图片
  9. nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
  10. 柯洁放言力拼AlphaGo:我抱有必死的信念!(全部细节都在这里)