BZOJ2303 APIO2011方格染色
这题太神了
首先我们可以发现只有当i和j都是偶数时a[1][1]^a[1][j]^a[i][1]^a[i][j]=1才满足情况,其它时都为0
所以我们可以先把i和j都为偶数的地方^1变为0
下面才是最牛逼的地方,并查集的应用在这里体现的淋漓尽致。
0表示相同 1表示不同
一开始赋初值都表示为相同
然后每次更新并查集时只要更新他到根所有的数异或起来就是他与根的关系
由于根的g一定为0,所以此时得到的还有它实际应该是多少
我们假设一种比较复杂的情况
我们只有a[1][j]^a[i][1]^a[i][j]=0才成立!
假设此时a[i][j]的值为1(题目给出)
所以当且仅当a[1][j]与a[i][1]颜色不同时才成立
假设此时i到根异或起来为1,j到根异或起来为0
也就是说i与根颜色不同,j与根颜色相同
那么我们把两根合并时两根关系应该是什么?
相同对不对!
我们又发现此时分于两树时a[1][j]^a[i][1]^a[i][j]也为0(1^0^1=0)
结果一样对不对!
仔细想想其实他是因为异或满足的三角关系
于是乎很轻松的解决了
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+,mod=1e9;
typedef long long ll;
struct node{
int x,y,z;
}a[N];
int n,m,k,fa[N],g[N];
int get(int x)
{
if(x==fa[x])return x;
int t=get(fa[x]);
g[x]^=g[fa[x]];
return fa[x]=t;
}
ll calc()
{
for(int i=;i<=m+n;++i)fa[i]=i=i,g[i]=;
fa[+n]=;
for(int i=;i<=k;++i)
{
int fx=get(a[i].x),fy=get(a[i].y+n);
int tmp=g[a[i].x]^g[a[i].y+n]^a[i].z;
if(fx!=fy){
g[fx]=tmp;fa[fx]=fy;
}
else if(tmp)return ;
}
int ans=;
for(int i=;i<=n+m;++i)
{
if(get(i)==i)
{
if(ans==)ans=;
else
{
ans<<=;ans%=mod;
}
}
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int flag=-;
for(int i=;i<=k;++i)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
if(a[i].x+a[i].y==){flag=a[i].z,k--,i--;continue;}
if(!((a[i].x|a[i].y)&))a[i].z^=;
}
ll ans=;
if(flag==-||flag==)ans=calc();
if(flag==-||flag==){
for(int i=;i<=k;++i)
if(a[i].x>&&a[i].y>)
a[i].z^=;
ans+=calc();
}
ans%=mod;
printf("%lld\n",ans);
return ;
}
BZOJ2303 APIO2011方格染色的更多相关文章
- [BZOJ2303][Apio2011]方格染色
[BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...
- 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)& ...
- BZOJ2303: [Apio2011]方格染色 【并查集】
Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 ...
- BZOJ2303 [Apio2011]方格染色 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2303 题意概括 现在有一个N*M矩阵,矩阵上只能填数字0或1 现在矩阵里已经有一些格子被填写了数字 ...
- BZOJ_2303_[Apio2011]方格染色 _并查集
BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...
- bzoj 2303: [Apio2011]方格染色
传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...
- 【题解】P3631 [APIO2011]方格染色
很有意思的一道题,所以单独拿出来了. 完整分享看 这里 题目链接 luogu 题意 有一个包含 \(n \times m\) 个方格的表格.要将其中的每个方格都染成红色或蓝色.表格中每个 \(2 \t ...
- 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个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
随机推荐
- Lua的各种资源2
Lua Directory This page is a top level directory of all Lua content at this wiki, grouped by top ...
- phpcms模板
cms的样式有很多种,我们学习的是phpcms,这些cms都是大同小异,学会了一种就可以使用其它的cms. PHPCMS是一款网站管理软件.该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性 ...
- 巧用margin/padding的百分比值实现高度自适应
原文:https://segmentfault.com/a/1190000004231995 一个基础却又容易混淆的css知识点 本文依赖于一个基础却又容易混淆的css知识点:当margin/padd ...
- 设计模式之Adapter
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: 将两个不兼容的类纠合在一起使用,属于结构型模式,也有人称它为wrapper(包装类). 包装类 ...
- logging模块配置笔记
logging模块配置笔记 log文件的路径 #判断在当前的目录下是否有一个logs文件夹.没有则创建 log_dir = os.path.dirname(os.path.dirname(__file ...
- Nim 游戏、SG 函数、游戏的和
Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG).满足以 ...
- caffe Python API 之Model训练
# 训练设置 # 使用GPU caffe.set_device(gpu_id) # 若不设置,默认为0 caffe.set_mode_gpu() # 使用CPU caffe.set_mode_cpu( ...
- java基础9 main函数、this、static、super、final、instanceof 关键字
一.main函数详解 1.public:公共的.权限是最大的,在任何情况都可以访问 原因:为了保证jvm在任何情况下都可以访问到main法2.static:静态,静态可以让jvm调用更方便,不需要用 ...
- 模块定义文件.def
一作用 DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport),这里不再举例说明:另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供 ...
- csu 1803(余数分类)
1803: 2016 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 565 Solved: 364[Submit][Status][Web Board ...