CF461D-Appleman and Complicated Task【并查集】
正题
题目链接:https://www.luogu.com.cn/problem/CF461D
题目大意
\(n*n\)的网格需要填上\(x\)或\(o\),其中有\(k\)个格子已经固定,求有多少中填写方案使得每个格子的四周都有偶数个\(o\)。
解题思路
约束条件相当于一个格子周围的异或和都为\(0\),也就是对于任意\((x,y)\)都有\(a_{x-1,y}\ xor\ a_{x,y-1}\ xor\ a_{x+1,y}\ xor\ a_{x,y+1}\)。也就是对于一个格子\((x,y)\)也有\(a_{x,y}=a_{x-1,y-1}\ xor\ a_{x-1,y+1}\ xor\ a_{x-2,y}\)
根据以上我们可以发现对于一个格子的值都可以由第一行的某些格子的异或和来表示,且它们格子的奇偶相同。
从这个蓝色格子来看,它的值等于黄色格子和青色格子的异或和。
其中两个黄色格子又都包括了青色格子,所以相互抵消,中间缺失的青色格子回本蓝色本身补回来,而周围的绿色格子不会被抵消。
所以能够发现其实蓝色格子的异或和就等于某一行里被红线夹着的同奇偶的格子的异或和。
这样我们对于一个固定的点就相等于限制奇或偶的一个区间异或值。
差分完之后就变为了判断两个格子是否相等,用并查集判即可。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
const long long P=1e9+7,inv2=(P+1)/2;
int n,k,fa[N];
int find(int x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
bool Calc(int l,int r,int w){
if(w){
if(find(l)==find(r))return 0;
if(find(l)==find(r+n))return 1;
fa[find(r+n)]=find(l);
fa[find(l+n)]=find(r);
}
else{
if(find(l)==find(r+n))return 0;
if(find(l)==find(r))return 1;
fa[find(r)]=find(l);
fa[find(r+n)]=find(l+n);
}
return 1;
}
int main()
{
scanf("%d%d",&n,&k);
int p=n;n+=2;
for(int i=1;i<=2*n;i++)fa[i]=i;
for(int i=1;i<=k;i++){
int x,y;char w[2];
scanf("%d%d%s",&x,&y,&w);x--;y--;
int l=abs(x-y),r=min(x+y,2*(p-1)-x-y)+2;
if(!Calc(l,r,w[0]=='o'))
return puts("0")&0;
}
long long ans=inv2*inv2%P,z=0;
for(int i=0;i<2*n;i++)
if(find(i)==i)z++;z/=2;
while(z)z--,ans=ans*2%P;
printf("%lld\n",ans);
return 0;
}
CF461D-Appleman and Complicated Task【并查集】的更多相关文章
- [cf461D]Appleman and Complicated Task
假设该矩形是aij,那么有a(i,j)=a(i-1,j-1)^a(i-1,j+1)^a(i-2,j),不断递归下去可以发现a(i,j)=a(1,y-x+1)^a(1,y-x+3)^--^a(1,x+y ...
- Codeforces 461D. Appleman and Complicated Task 构造,计数
原文链接https://www.cnblogs.com/zhouzhendong/p/CF461D.html 题解 首先我们可以发现如果确定了第一行,那么方案就唯一了. 然后,我们来看看一个点的值确定 ...
- HDU 3974 Assign the task 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=3974 题目大意: 一个公司有N个员工,对于每个员工,如果他们有下属,那么他们下属的下属也是他的下属. 公司会给员 ...
- HDU 3974 Assign the task 并查集/图论/线段树
Assign the task Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- Brain Network (easy)(并查集水题)
G - Brain Network (easy) Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- *HDU2473 并查集
Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Codeforces Round #212 (Div. 2) D. Fools and Foolproof Roads 并查集+优先队列
D. Fools and Foolproof Roads You must have heard all about the Foolland on your Geography lessons. ...
- HD2444The Accomodation of Students(并查集判断二分图+匹配)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- hdu 1116 Play on Words 欧拉路径+并查集
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
随机推荐
- Mac 证书错误
在 Mac 操作系统安装 Python 3.6 或以上版本时,可能会遇到证书错误:Error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify ...
- WindowsService开发简单入门
参考网址: https://www.cnblogs.com/wenlong512/p/7355971.html 一.简介 程序创建在 Windows 会话中,可长时间运行的可执行应用程序.这些服务可以 ...
- FLV简介
FLV (Flash Video) 是由 Adobe 公司推出的一种封装格式,主要用于流媒体系统. FLV 封装的媒体文件具有体积轻巧.封装播放简单等特点,很适合网络应用. 目前各浏览器普遍使用 Fl ...
- 关于 java编程思想第五版 《On Java 8》
On Java 8中文版 英雄召集令 这是该项目的GITHUB地址:https://github.com/LingCoder/OnJava8 广招天下英雄,为开源奉献!让我们一起来完成这本书的翻译吧! ...
- list切片
对list进行切片 取一个list的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] 取前3个元素 ...
- Dijkstra链路状态选路算法
- 模拟文件上传(三):使用apache fileupload组件进行文件批量上传
其中涉及到的jar包 jsp显示层: <%@ page language="java" import="java.util.*" pageEncoding ...
- playwright-python 截图、录制视频、录制接口(二)
截图 fullPage为True时,截取全屏,默认为False clip截取特定部分的图片,{"x": float, "y": float, "wid ...
- rEFI引导Win10+Ubuntu14双系统
公司买了一台Alienware 15 R2,安装双系统折腾死我了,现在记录一下安装过程. 硬盘: 256固态+1T机械 安装顺序: 先Windows,再Ubuntu 不同BIOS启动方式下安装系统 U ...
- 用C++实现的增强Eratosthenes筛法程序
运行示例 PS H:\Read\num\x64\Release> .\eSievePro Eratosthenes sieve: a method to find out all primes ...