首先考虑四个格子异或值为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 方格染色的更多相关文章

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

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

  2. [BZOJ2303][Apio2011]方格染色

    [BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...

  3. BZOJ_2303_[Apio2011]方格染色 _并查集

    BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...

  4. BZOJ 5306 [HAOI2018] 染色

    BZOJ 5306 [HAOI2018] 染色 首先,求出$N$个位置,出现次数恰好为$S$的颜色至少有$K$种. 方案数显然为$a_i=\frac{n!\times (m-i)^{m-i\times ...

  5. bzoj 2303: [Apio2011]方格染色

    传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...

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

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

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

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

  8. 【bzoj 2303】【Apio2011】方格染色

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2303 题解: 很神奇的思路,膜一发大佬http://www.cnblogs.com/HHsh ...

  9. bzoj 2303: [Apio2011]方格染色【并查集】

    画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...

随机推荐

  1. Delphi美化界面 转载

    手头的项目做的差不多了,交给客户,结果给出的结论是界面太难看了,至少要做成像QQ类似的界面.(目前是QQ2009界面确实还是不错的,本人也非常喜欢). 1.透明问题. 要重新调整界面确实很麻烦,以前用 ...

  2. iOS-xib(使用XIB实现嵌套自定义视图)

    参考:http://wtlucky.github.io/geekerprobe/blog/2014/08/10/nested-xib-views/?utm_source=tuicool 因为主要练习x ...

  3. 2015年4月 15款免费jQuery插件

    点这里 We have collected for you the 15 fresh, free and handy jQuery plugins that will help to speed up ...

  4. lintcode: 最长无重复字符的子串

    题目 最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串. 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 ...

  5. JAVA数据库连接池实现(转)

    连接池的管理用了了享元模式,这里对连接池进行简单设计. 一.设计思路 1.连接池配置属性DBbean:里面存放可以配置的一些属性 2.连接池接口IConnectionPool:里面定义一些基本的获取连 ...

  6. UITableview刷新某一个cell或section

    //一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tableview reloadSections:in ...

  7. TestDirector安装配置

    一.介绍 TestDirector是全球最大的软件测试工具提供商,公司生产企业级测试管理工具,也是业界第一个基于Web的测试管理系统,它可以在公司内部或外部进行全球范围内测试的管理.通过在一个整体的应 ...

  8. SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-002设置JPA的EntityManagerFactory(<persistence-unit>、<jee:jndi-lookup>)

    一.EntityManagerFactory的种类 1.The JPA specification defines two kinds of entity managers:  Applicatio ...

  9. SPRING IN ACTION 第4版笔记-第十章Hitting the database with spring and jdbc-001-Spring对原始JDBC的封装

    1.spring扩展的jdbc异常 2.Template的运行机制 Spring separates the fixed and variable parts of the data-access p ...

  10. DB2_SQL_常用知识点&实践

    DB2_SQL_常用知识点&实践 一.删除表中的数据(delete或truncate) 1 truncate table T_USER immediate; 说明:Truncate是一个能够快 ...