BZOJ 2303 方格染色
首先考虑四个格子异或值为1。
然后(重点)发现每个格子的值只和最上面,最左边,和(1,1)的格子的颜色有关。
枚举(1,1)的颜色,联立方程,可以将未知数减少,那么并查集可做。
最后算答案的时候,有些连通块颜色确定,有些不确定,不确定的*2即可。
这题要注意细节!其实一开始的思路最不好想。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000500
#define mod 1000000000
using namespace std;
struct pnt
{
int x,y,c;
}p[maxn];
int n,m,k,fath[maxn<<],dis[maxn<<],val[maxn<<],flag=-,cnt[maxn<<];
void reset()
{
for (int i=;i<=(n-)+(m-);i++)
{
fath[i]=i;
dis[i]=;
val[i]=-;
cnt[i]=;
}
}
int getfather(int x)
{
if (x==fath[x]) return fath[x];
if (val[x]!=-)
{
if ((val[fath[x]]!=-) && (val[fath[x]]!=(val[x]^dis[x])))
return -;
val[fath[x]]=val[x]^dis[x];
}
int ret=getfather(fath[x]);
dis[x]^=dis[fath[x]];
fath[x]=ret;
return fath[x];
}
int f_pow(int a,int b)
{
int base=a,ans=;
while (b)
{
if (b&) ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=;
}
return ans%mod;
}
int gets(int r)
{
int ans=;
if (flag==-r) return ;
reset();
for (int i=;i<=k;i++)
{
if ((p[i].x==) && (p[i].y==))
{
if (p[i].c!=r) return ;
}
else if ((p[i].x==) && (p[i].y!=)) {if ((val[n+p[i].y-]!=p[i].c) && (val[n+p[i].y-]!=-)) return ;val[n+p[i].y-]=p[i].c;}
else if ((p[i].x!=) && (p[i].y==)) {if ((val[p[i].x-]!=p[i].c) && (val[p[i].x-]!=-)) return ;val[p[i].x-]=p[i].c;}
else
{
int x=p[i].x-,y=n+p[i].y-;
int f1=getfather(x),f2=getfather(y);
if ((f1==-) || (f2==-)) return ;
if (f1==f2)
{
int ret=dis[x]^dis[y]^r;
if ((p[i].x%==) && (p[i].y%==)) ret^=;
if (ret!=p[i].c) return ;
}
else
{
int ret=p[i].c^dis[x]^dis[y]^r;
if ((p[i].x%==) && (p[i].y%==)) ret^=;
if ((val[f1]!=-) && (val[f2]!=-))
{
if ((val[f1]^ret)!=val[f2]) return ;
}
else if ((val[f1]==-) && (val[f2]!=-)) {fath[f1]=f2;dis[f1]=ret;}
else if ((val[f1]!=-) && (val[f2]==-)) {fath[f1]=f2;dis[f1]=ret;val[f2]=val[f1]^ret;}
else {fath[f1]=f2;dis[f1]=ret;}
}
}
}
for (int i=;i<=(n-)+(m-);i++)
{
int ret=getfather(i);
if (ret==-) return ;
cnt[ret]++;
}
for (int i=;i<=(n-)+(m-);i++)
{
if ((fath[i]==i) && (val[i]==-))
ans=(ans*)%mod;
}
return ans%mod;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=k;i++)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].c);
if ((p[i].x==) && (p[i].y==)) flag=p[i].c;
}
printf("%d\n",(gets()+gets())%mod);
return ;
}
BZOJ 2303 方格染色的更多相关文章
- BZOJ 2303 方格染色(带权并查集)
要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...
- [BZOJ2303][Apio2011]方格染色
[BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...
- BZOJ_2303_[Apio2011]方格染色 _并查集
BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...
- BZOJ 5306 [HAOI2018] 染色
BZOJ 5306 [HAOI2018] 染色 首先,求出$N$个位置,出现次数恰好为$S$的颜色至少有$K$种. 方案数显然为$a_i=\frac{n!\times (m-i)^{m-i\times ...
- bzoj 2303: [Apio2011]方格染色
传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...
- 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个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
- 【bzoj 2303】【Apio2011】方格染色
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2303 题解: 很神奇的思路,膜一发大佬http://www.cnblogs.com/HHsh ...
- bzoj 2303: [Apio2011]方格染色【并查集】
画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...
随机推荐
- POJ 2923 Relocation (状态压缩,01背包)
题意:有n个(n<=10)物品,两辆车,装载量为c1和c2,每次两辆车可以运一些物品,一起走.但每辆车物品的总重量不能超过该车的容量.问最少要几次运完. 思路:由于n较小,可以用状态压缩来求解. ...
- SPL学习 迭代器
主要学习内容: 慕课网的spl视频教程 阮一峰SPL学习笔记 http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html SPL类详解 http ...
- POJ 1477
#include <iostream> #define MAXN 100 using namespace std; int _[MAXN]; int main() { //freopen( ...
- 【poj1284-Primitive Roots】欧拉函数-奇素数的原根个数
http://poj.org/problem?id=1284 题意:给定一个奇素数p,求p的原根个数. 原根: { (xi mod p) | 1 <= i <= p-1 } is equa ...
- Android异步下载图片并且缓存图片到本地
Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...
- CentOS系统安装tomcat
按照以下步骤操作即可wget http://mirrors.noc.im/apache/tomcat/tomcat-9/v9.0.0.M6/bin/apache-tomcat-9.0.0.M6.tar ...
- JSX架构及注释
一.架构 二.注释 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...
- mysql 常用命令(备忘)
1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2.创建一个数据库MYSQLDATA mysql> CREATE DATABASE ...
- 290. Word Pattern
题目: Given a pattern and a string str, find if str follows the same pattern. Here follow means a full ...
- iOS:CALayer核心动画层上绘图
在CALayer上绘图: •要在CALayer上绘图,有两种方法: 1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图 2.设置 ...