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

Description

Sam和他的妹妹Sara有一个包含n × m个方格的
表格。她们想要将其的每个方格都染成红色或蓝色。
出于个人喜好,他们想要表格中每个2 ×   2的方形区
域都包含奇数个(1 个或 3 个)红色方格。例如,右
图是一个合法的表格染色方案(在打印稿中,深色代
表蓝色,浅色代表红色) 。
可是昨天晚上,有人已经给表格中的一些方格染上了颜色!现在Sam和Sara
非常生气。不过,他们想要知道是否可能给剩下的方格染上颜色,使得整个表格
仍然满足她们的要求。如果可能的话,满足他们要求的染色方案数有多少呢?

Input

输入的第一行包含三个整数n, m和k,分别代表表格的行数、列数和已被染
色的方格数目。
之后的k行描述已被染色的方格。其中第 i行包含三个整数xi, yi和ci,分别
代表第 i 个已被染色的方格的行编号、列编号和颜色。ci为 1 表示方格被染成红
色,ci为 0表示方格被染成蓝色。

Output

输出一个整数,表示可能的染色方案数目 W 模 10^9得到的值。(也就是说,如果 W大于等于10^9,则输出 W被10^9除所得的余数)。

对于所有的测试数据,2 ≤ n, m ≤ 106
,0 ≤ k ≤ 10^6
,1 ≤ xi ≤ n,1 ≤ yi ≤ m。

Sample Input

3 4 3
2 2 1
1 2 0
2 3 1

Sample Output

8


对于(i,j)有a[i][j]^a[i+1][j]^a[i][j+1]^a[i+1][j+1]=1

从(1,1)到(i-1,j-1)的这个式子全都异或起来。

得到a[1][1]^a[1][j]^a[i][1]^a[i][j]=[i%2==0&&j%2==0]。

即确定了第一行和第一列的颜色就确定了整个方格的颜色。

于是枚举(1,1)的颜色,对于每个(x,y,c),把a[1][y]和a[x][1]用并查集连起来。

有环则无解,否则答案等于二的连通块个数-1次方。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
#define N 2000050
inline char nc() {
    static char buf[100000],*p1,*p2;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd() {
    register int x=0;
    register char s=nc();
    while(s<‘0‘||s>‘9‘) s=nc();
    while(s>=‘0‘&&s<=‘9‘) x=(x<<3)+(x<<1)+s-‘0‘,s=nc();
    return x;
}
int fa[N],n,m,a[N],k,xx[N],yy[N],cc[N];
ll mod=1000000000;
ll qp(ll x,ll y) {ll re=1; for(;y;y>>=1ll,x=x*x%mod) if(y&1ll) re=re*x%mod; return re;}
int find(int x) {
    if(fa[x]==x) return x;
    int tmp=find(fa[x]);
    a[x]^=a[fa[x]];
    return fa[x]=tmp;
}
int main() {
    n=rd(); m=rd(); k=rd();
    register int i;
    for(i=1;i<=k;i++) {
        xx[i]=rd(); yy[i]=rd(); cc[i]=rd();
    }
    int col1,flg[2];
    flg[0]=flg[1]=0;
    ll ans=0;
    for(col1=0;col1<2;col1++) {
        int cnt=0;
        for(i=1;i<=n+m-1;i++) fa[i]=i,a[i]=0;
        for(i=1;i<=k;i++) {
            int p=col1^cc[i]^(xx[i]%2==0&&yy[i]%2==0);
            int x=xx[i],y=yy[i]+n-1;
            int dx=find(x),dy=find(y);
            if(dx!=dy) {
                fa[dx]=dy;
                a[dx]=a[y]^a[x]^p;
            }else {
                if((a[x]^a[y])!=p) {
                    flg[col1]=1; break;
                }
            }
        }
        for(i=1;i<=n+m-1;i++) {
            if(fa[i]==i) {
                cnt++;
            }
        }
        cnt--;
        if(!flg[col1]) {
            ans=(ans+qp(2,cnt))%mod;
        }
    }
    printf("%lld\n",ans);
}

原文地址:https://www.cnblogs.com/suika/p/9021367.html

时间: 2024-08-18 13:54:20

BZOJ_2303_[Apio2011]方格染色 _并查集的相关文章

BZOJ2303: [Apio2011]方格染色

2303: [Apio2011]方格染色 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1927  Solved: 744[Submit][Status][Discuss] Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 ×   2的方形区 域都包含奇数个(1 个或 3 个)红色方格.例如,右 图是一个合法的表格染色方案(在打印稿中,

bzoj 2303: [Apio2011]方格染色

传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 个)红色方格.例如,右图是一个合法的表格染色方案(在打印稿中,深色代表蓝色,浅色代表红色) . 可是昨天晚上,有人已经给表格中的一些方格染上了颜色!现在Sam和Sara非常生气.不过,他们想要知道是否可能给剩下的方格染上颜色,使得整个表格仍然满足她们的要求.如果可能的话,满足他们要求的染色

hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants to make the graph become a complete bipartite graph with most edges by adding some extra edges. Soda needs you to tell him the maximum number of edges

Farm Irrigation_深搜_并查集

Farm Irrigation TimeLimit: 2000/1000 MS (Java/Others)  MemoryLimit: 65536/32768 K (Java/Others) 64-bit integer IO format:%I64d Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of

jzoj 2936_逐个击破_并查集

题目描述 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,maozedong制定了先切断敌人东洒两头退路然后再逐个歼灭敌人的战略方针. 秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的战场局面: 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花

冗余关系_并查集

冗余关系 蒜头最近在沉迷小说,尤其是人物关系复杂的言情小说.它看到的人物关系描述得很的麻烦的时候觉得非常蒜疼,尤其是任务关系里有冗余的时候.什么是冗余关系呢? 这篇小说里有n句描述人物关系的句子,描述了n个人的关系. 每条句子的定义是这样的: X<->Y    它的意思是:X认识Y,Y也认识X 我们认为小说中的人物关系是具有传递性的,假如A认识B,B认识C,则A也认识C. 冗余关系的定义:就是即使没有这条人物关系,原来的人物之间的所有关系也照样成立. 比如: 小说中已经提到了A认识B,B也认识

连通分量个数(连通分量_并查集)

 连通分量个数Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description 在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通.如果图中任意两个顶点之间都连通,则称该图为连通图, 否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含

[bzoj1455]罗马游戏_左偏树_并查集

罗马游戏 bzoj-1455 题目大意:给你n个人,2种操作,m次操作:1.将i号士兵所在的集合的最小值删除 2.合并i和j两个士兵所在的团体 注释:$1\le n\le 10^6$,$1\le m \le 10^5$. 想法:又是GXZlegend讲课,可并堆中的左偏树.了解一下: 一个具有堆性质的二叉树满足任意一个节点x中,dis[lson[x]]>=dis[rson[x]],其中,dis表示当前节点一直走右儿子的最长步数.合并是递归合并,我们通过递归处理一两个节点为根节点的左偏树的合并,显

BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

Description 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂直或水 平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样, 图中农场用F1..F7表示, 每个农场最多能在东西南北四个方向连结4个不同的农场.此外,农场只处在道路的两端.道路不会交叉且每对农场间有且仅有一条路径.邻居鲍伯要约翰来导航,但约翰丢了农场的地图,他只得从电脑的备份中修复了.每一条道路的信息如下: 从农场23往南经距离10到达农场17 从农场1往