BZOJ2303 [Apio2011]方格染色 并查集
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ2303
题意概括
现在有一个N*M矩阵,矩阵上只能填数字0或1
现在矩阵里已经有一些格子被填写了数字,询问是否存在一种填写方案使得「任意一个2*2的矩阵异或和为1」,输出方案总数
题解
我们发现当我们已经确定(1,1)的颜色为1的时候:
我们知道c(i,j)。
那么如果i和j都是偶数,那么就有c(1,1)^c(i,1)^c(1,j)^c(i,j)==1
否则就是0。
因为假设s(i,j)表示以i,j为左上角的2*2矩阵异或起来,那么:
S(1,1)^S(1,2)^...^S(1,j)^S(2,1)^S(2,2)^...^S(i-1,j-1)=c(1,1)^c(i,1)^c(1,j)^c(i,j)。
而左式就等于(i-1)*(j-1)个1异或。
这是一个好东西。
然后我们枚举(1,1)的颜色,然后对于每一个C(i,j)就可以得到一组C(i,1)和C(1,j)的关系。
但是当i=1或者j=1的时候,是得到一个C(i,1)或者C(1,j)的答案。
最后得到关系之后,只需要看看是否矛盾。
然后统计连通块数,就是自由元的总数,每一个自由元有2种取值,于是答案显而易见。
注意输入有i=j=1的情况要特判。
细节有点多。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int N=1000005,mod=1e9;
int n,m,ad,k,v[N*4],fa[N*4];
struct color{
int a,b,c;
}co[N];
int Turn(int a,int b){
return a==1?(b-1):(a-1+m-1);
}
int getf(int k){
return fa[k]==k?k:fa[k]=getf(fa[k]);
}
int solve(){
memset(v,-1,sizeof v);
for (int i=1;i<=ad*2;i++)
fa[i]=i;
for (int i=1;i<=k;i++){
int a=co[i].a,b=co[i].b,c=co[i].c;
if (a==1&&b==1)
continue;
if (a==1||b==1){
v[Turn(a,b)]=c,v[Turn(a,b)+ad]=c^1;
continue;
}
int A=Turn(a,1),B=Turn(1,b);
int res=(!(a&1)&&!(b&1))^c;
if (res){
if (getf(A)==getf(B))
return 0;
fa[getf(A)]=getf(B+ad);
fa[getf(B)]=getf(A+ad);
}
else {
if (getf(A)==getf(B+ad))
return 0;
fa[getf(A)]=getf(B);
fa[getf(A+ad)]=getf(B+ad);
}
}
for (int i=1;i<=ad*2;i++){
if (v[i]==-1)
continue;
if (v[getf(i)]==-1)
v[getf(i)]=v[i];
else if (v[getf(i)]!=v[i])
return 0;
}
int res=1,ans=0;
for (int i=1;i<=ad*2;i++)
if (getf(i)==i&&v[i]==-1)
ans++;
for (ans>>=1;ans--;)
res=res*2%mod;
return res;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
ad=n+m-2;
int flag=-1;
for (int i=1;i<=k;i++){
scanf("%d%d%d",&co[i].a,&co[i].b,&co[i].c);
if (co[i].a==1&&co[i].b==1)
flag=co[i].c;
}
int ans1=solve();
for (int i=1;i<=k;i++)
if (co[i].a>1&&co[i].b>1)
co[i].c^=1;
int ans2=solve();
int ans=0;
if (flag==-1)
ans=(ans1+ans2)%mod;
else
ans=flag?ans2:ans1;
printf("%d",ans);
return 0;
}
BZOJ2303 [Apio2011]方格染色 并查集的更多相关文章
- BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
- [BZOJ2303][Apio2011]方格染色
[BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...
- BZOJ2303: [Apio2011]方格染色 【并查集】
Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 ...
- BZOJ2303 APIO2011方格染色
这题太神了 首先我们可以发现只有当i和j都是偶数时a[1][1]^a[1][j]^a[i][1]^a[i][j]=1才满足情况,其它时都为0 所以我们可以先把i和j都为偶数的地方^1变为0 下面才是最 ...
- 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)& ...
- BZOJ_2303_[Apio2011]方格染色 _并查集
BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...
- bzoj 2303: [Apio2011]方格染色【并查集】
画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第 ...
- bzoj 2303: [Apio2011]方格染色
传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...
- 【题解】P3631 [APIO2011]方格染色
很有意思的一道题,所以单独拿出来了. 完整分享看 这里 题目链接 luogu 题意 有一个包含 \(n \times m\) 个方格的表格.要将其中的每个方格都染成红色或蓝色.表格中每个 \(2 \t ...
随机推荐
- VS设置以管理员方式运行
一直以为VS不能直接以管理员方式运行,原来它是在高级里的.
- asp.net mvc Htmlhelper简单扩展
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 关于Laravel 迁移数据库的问题
今天在Homestead 中用 php artisan migrate 迁移数据库时出现了拒绝的情况: ***之后发现只要修改项目文件夹下面的database.php 和.env 文件中的数据库配置, ...
- mysql 查询优化案例汇总
一 简介:此文章为经历过的sql案例集合和相关思路 二 案例1: 现象: 测试环境出现select语句,join2张表多次join,explain结果如下 出现 using where,using j ...
- 论文笔记系列-Neural Architecture Search With Reinforcement Learning
摘要 神经网络在多个领域都取得了不错的成绩,但是神经网络的合理设计却是比较困难的.在本篇论文中,作者使用 递归网络去省城神经网络的模型描述,并且使用 增强学习训练RNN,以使得生成得到的模型在验证集上 ...
- JXL读取Excel(只支持xls版本)——(二)
注意:jxl是不支持xlsx后缀的excel的.因此建议用POI读取excel. Jar包 同一一样 Java代码 package JXL; import java.io.File; import j ...
- oracle建包,函数demo
create table BOOK ( BOOK_ID NUMBER(10), BOOK_NAME VARCHAR2(10) ); create or replace package chen_pac ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer
1.前言 2.generate timer 2.1 概述 提供了一个系统计数器,用来实时测量流逝的时间: 提供了一个虚拟计数器,用来测量某个虚拟机上流逝的虚拟时间: 定时器,每隔一段时间会触发事件,支 ...
- CROSSUI桌面工具 分布加载模块(Distributed UI Module) 与 主模块Module 之间数据传输!
CROSSUI 基于 NW,如何在模Module 之间(主index.js and module1.js)传输数据? http://www.crossui.com/Forum/post577.htm ...
- sql 学习
.查看表结构用desc desc emp; 2.空表dual,最常用的空表,如: select 2 * 4 from dual; select sysdate from dual; 3.双引号 ...