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个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
随机推荐
- html css 如何将表头固定
position属性取值为fixed时,则元素的位置将不受滚动条的影响,而是直接依据窗口定位,这就是将表头固定的最直接方法,网上其他途径感觉都是在走弯路.但是与此同时必须解决两个问题.第一:表体将随之 ...
- Map总结
Map是键值对集合,是一对一对往上存的,要保持键的唯一性 形式:Map<K, V> 方法: 增 put(K key, V value) 若存储时Map中有相同的键,则返回原来键的值,并覆盖 ...
- (值类型引用类型)和null的关系
1.null null表示变量没有指向任何对象. 2.值类型 包括 bool.结构体.枚举.int.double.float等等 .在.NET中值类型都继承自ValueType. 3. 引 ...
- 【洛谷 P2147】 [SDOI2008]洞穴勘测(LCT)
题目链接 LCT裸题.. #include <cstdio> #define R register int #define I inline void #define lc c[x][0] ...
- 2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)
题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...
- Redis数据类型之列表(list)
1. 什么是列表 redis的列表使用双向链表实现,往列表中放元素的时候复杂度是O(1),但是随机访问的时候速度就不行了,因为需要先遍历到指定的位置才可以取到元素. 既然列表是使用链表实现的,那么就说 ...
- Verilog笔记.6.FIFO
FIFO,First In First Out ,是一种先进先出的数据缓存器. 没有外部读写地址线,只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成. 不能像普通存储器那样可以 ...
- layui利用jQuery设置下拉列表的值
今天在利用jQuery动态设置下拉列表的值的时候确怎么也赋值不上去,其中用到了layui框架,源代码如下: $.post(contextPath+'/courseLibrary/getCourseBa ...
- 数据库管理软件 Navicat Premium12 破解步骤
数据库管理软件 Navicat Premium12B https://pan.baidu.com/s/1QnAQwW-q0SQ1JglpFGxKOA 密码 : mwqc 里面的软件和补丁是 ...
- nvidia tx1使用记录--基本环境搭建
前言 之前有专门写过一篇nvidia tk1使用记录--基本环境搭建,本以为自己有过tk1的经验后,在tx1上搭建和它一样的环境会轻车熟路,结果却是在nvidia tx1上花的时间居然比tk1还多.我 ...