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 ...
随机推荐
- ubunt中,使用命令su命令切换root账户,提示认证失败
报错截图: 解决方法: sudo passwd 重新设置root账户的密码,确认root账户的密码(再次输入密码),然后su ,输入root账户刚刚设置的密码即可切入到root账户:
- jpa中使用Query判断条件查询
jpa中使用Query判断条件查询 @Query(value = " select m.* from mining_area as m " + " where 1 = 1 ...
- mysql 局域网连接
下面分别简述操作: 配置虚拟机网络 默认方式是NAT,但为了让宿主机之外的其它计算机也能访问虚拟机,NAT方式配置起来有些复杂,这里推荐用桥接模式,关于VM的几种网络方式的区别,可以参考这篇文章配置好 ...
- const 修饰
int * const grape_jelly; 指针是只读的. const int * grape; int const * grape; 指针所指向的对象是只读的. 对象和指针有可能都是只读的: ...
- servlet中servletContext的五大作用(三)
1. 获取web的上下文路径 2. 获取全局的参数 3. 作为域对象使用 4. 请求转发 5. 读取web项目的资源文件 package day10.about_serv ...
- 正整数a、b、c、d满足ab=cd,则a+b+c+d必定为合数。
正整数a.b.c.d满足ab=cd,则a+b+c+d必定为合数. 证法一:记s=a+b+c+d.如果四个数全为1,s=4,显然是合数.考虑四个数非全1的情形,由对称性,不妨令a>1. 设p是a的 ...
- BeanUtils基本使用方法与原理
使用BeanUtils的原因 因为setProperty是JSP中的标签,因此使用model 2模式JSP+Servlet+JavaBean的时候,JSP将form提交给Servlet程序,而Serv ...
- 利用job提升马哈鱼数据血缘分析效率
利用job提升马哈鱼数据血缘分析效率 一.Job基本知识 前面文章中已介绍马哈鱼的基本功能,其中一个是job,job其实是一个任务集合处理的概念,就是让用户通过job,可以一次递交所有需要处理的 SQ ...
- Java中使用DOM4J来生成xml文件和解析xml文件
一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理 ...
- 20210803 noip29
考场 第一次在 hz 考试.害怕会困,但其实还好 看完题感觉不太难,估计有人 AK. T3 比较套路,没办法枚举黑点就从 LCA 处考虑,在一个点变成黑点时计算其他点和它的 LCA 的贡献,暴力跳父亲 ...