TZOJ 3042 切蛋糕(并查集)
描述
KK是个心灵手巧的好姑娘,她做了一个大蛋糕请她的好朋友们来品尝。
这个蛋糕分成n×n个正方形小格,每个小格包含一块水果。KK要把蛋糕切成若干块,显然她不会破坏任意一个小格。
无聊的某同学在她切蛋糕时不停地问她同一种问题:某两个小格是否还在同一块蛋糕里?
例如下图中,KK从(1,1)切到(4,1),又从(1,1)切到(1,4),从而将蛋糕分成了两块。然后又从(2,1)切到(2,3),从(1,3)切到(2,3),于是把整个蛋糕分成了三块。其中小格(2,2)只和小格(2,3)连通,与其它所有小格不连通。
KK被这些无聊的问题烦透了,她请求你编写一个程序让他闭嘴。
输入
输入包括多组数据。
每组数据第一行为两个整数:蛋糕大小n (1≤n≤1000),以及KK切蛋糕次数和问题数之和q (1≤q≤100000)
然后q行,每行是下面两者之一,描述了切蛋糕和问问题的过程:
- cut x1 y1 x2 y2
沿着坐标(x1,y1)和(x2,y2)连成的直线段切割蛋糕。
输入数据确保x1=x2和y1=y2恰有其一成立,坐标(x1,y1)和(x2,y2)连成的直线段一定在蛋糕内部,并且KK不会重复切同一位置。 - query x1 y1 x2 y2
询问格子(x1,y1)和(x2,y2)是否在同一块蛋糕上(1≤x1, y1, x2, y2≤n)
输入数据以n=q=0结束。
输出
对于输入数据中的query问题,如果两个格子在同一块蛋糕上则输出”Yes”,否则输出”No”。
样例输入
4 11
query 1 1 2 2
cut 1 1 4 1
cut 1 1 1 4
query 1 1 2 2
query 2 2 3 3
cut 2 3 2 1
query 2 2 3 3
cut 1 3 2 3
query 2 2 3 3
query 2 2 2 3
query 1 1 2 4
1000 1
query 1 1 1000 1000
0 0
样例输出
Yes
No
Yes
Yes
No
Yes
No
Yes
题意
每次切一条线段,查询两块蛋糕是否被切开。
题解
相当于相邻蛋糕用边相连,然后删除一些边,询问是否连通。
只有删边操作,那么可以考虑并查集,因为并查集是加边操作,所以可以把问题倒过来。
每次加入并查集一条最后删掉的边。
并查集路径压缩和按秩合并均摊O(1)。
总时间复杂度O(n^2+q)。
代码
#include<bits/stdc++.h>
using namespace std; const int N=1e6+;
const int M=1e5+;
int f[N],d[N];
bool g[][][],ans[M];
int dx[]={,};
int dy[]={,};
int n;
struct node
{
bool f;int x1,y1,x2,y2;
}q[M];
void init(int n)
{
for(int i=;i<=n;i++)for(int j=;j<=n;j++)for(int k=;k<;k++)g[i][j][k]=;
int n1=n*n;for(int i=;i<=n1;i++)d[i]=,f[i]=i;
}
int F(int x){return f[x]==x?x:F(f[x]);}
void merge(int x1,int y1,int x2,int y2)
{
int x=(x1-)*n+y1,y=(x2-)*n+y2;
x=F(x),y=F(y);
if(x==y)return;
if(d[x]==d[y])d[x]++;
if(d[x]<d[y])swap(x,y);
f[y]=x;
}
int main()
{
int Q;char s[];
while(scanf("%d%d",&n,&Q)!=EOF,n||Q)
{
init(n);
for(int i=;i<=Q;i++)
{
scanf("%s%d%d%d%d",s,&q[i].y1,&q[i].x1,&q[i].y2,&q[i].x2);
if(s[]=='q')q[i].f=;
else
{
q[i].f=;
if(q[i].x1==q[i].x2)
{
if(q[i].x1==n)continue;
if(q[i].y1>q[i].y2)swap(q[i].y1,q[i].y2);
for(int j=q[i].y1+;j<=q[i].y2;j++)g[q[i].x1][j][]=;
}
else
{
if(q[i].y1==n)continue;
if(q[i].x1>q[i].x2)swap(q[i].x1,q[i].x2);
for(int j=q[i].x1+;j<=q[i].x2;j++)g[j][q[i].y1][]=;
}
}
}
for(int i=;i<=n;i++)for(int j=;j<=n;j++)
{
for(int k=;k<;k++)
if(g[i][j][k]&&i+dx[k]<=n&&j+dy[k]<=n)
merge(i,j,i+dx[k],j+dy[k]);
}
for(int i=Q;i>=;i--)
{
if(q[i].f)//query
{
if(F((q[i].x1-)*n+q[i].y1)==F((q[i].x2-)*n+q[i].y2))ans[i]=;
else ans[i]=;
}
else//cut
{
if(q[i].x1==q[i].x2)
{
if(q[i].x1==n)continue;
for(int j=q[i].y1+;j<=q[i].y2;j++)
merge(q[i].x1,j,q[i].x1+,j);
}
else
{
if(q[i].y1==n)continue;
for(int j=q[i].x1+;j<=q[i].x2;j++)
merge(j,q[i].y1,j,q[i].y1+);
}
}
}
for(int i=;i<=Q;i++)if(q[i].f)printf("%s\n",ans[i]?"Yes":"No");
}
return ;
}
TZOJ 3042 切蛋糕(并查集)的更多相关文章
- 并查集(我根本不会切板子啊喂QWQ长文)(大雾
说句实话,我和并查集的缘分还是蛮深的,因为当年学完数论想着找板子题乱做(真是个神奇的找题方式呢),然后就看到了并查集QWQ,看了一会发现是图论就不看了,,,,,,结果还被说是大佬QWQ其实我只是个Na ...
- TZOJ 2648 小希的迷宫(并查集)
描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...
- TZOJ 1840 Jack Straws(线段相交+并查集)
描述 In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the ta ...
- [poj-2985]The k-th Largest Group_Treap+并查集
The k-th Largest Group poj-2985 题目大意:给你n只猫,有两种操作:1.将两只猫所在的小组合并.2.查询小组数第k大的小组的猫数. 注释:1<=n,m<=20 ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
- 洛谷P3295 萌萌哒 并查集 + ST表
又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...
- bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
- 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组
[BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...
- C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 && 并查集方法)
C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
随机推荐
- iOS开发系列-线程同步技术
概述 多线程的本质就是CPU轮流随机分配给每条线程时间片资源执行任务,看起来多条线程同时执行任务. 多条线程同时访问同一块资源,比如操作同一个对象.统一变量.同一个文件,就会引发数据错乱和数据安全的问 ...
- (转)nginx配置location总结及rewrite规则写法
注: rewrite 只能对域名后边的除去传递的参数外的字符串起作用,并且要写全域名后面的部分,如: http://i.com:9090/php/midou/admin.php/index/login ...
- apache日志配置一例,包括指定存储目录与格式、自动删除过期的日志文件
有需要的朋友可以参考下(http://www.nanke0834.com) 1.vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 添加或修改为:复 ...
- C#一般处理程序设置和读取session(session报错“未将对象引用设置到对象的实例”解决)
登陆模块时,用到了session和cookie.在一般处理程序中处理session,一直报错.最后找到问题原因是需要调用 irequiressessionstate接口. 在ashx文件中,设置ses ...
- 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...
- Error-IDEA:“Import from external model” 与 “Create from existing source”的区别
ylbtech-Error-IDEA:“Import from external model” 与 “Create from existing source”的区别 1.返回顶部 1. “Import ...
- 杂项-公司:Oracle
ylbtech-杂项-公司:Oracle 甲骨文公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩.1989年正式进入中国市场.201 ...
- CSS中关于多个class样式设置的不同写法
html中: <div class="containerA"> 这是AAAAAAAAAAAAAAAAAAAAAAA样式 <div class="cont ...
- 转:linux中select()函数分析
源地址:http://blog.csdn.net/zi_jin/article/details/4214359 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱 ...
- PHP面向对象魔术方法基本了解
简单介绍 (1) 魔术方法都是系统提供,程序员使用即可. (2) 所有的魔术方法,前面都是以 __ 开头的 _是两个下划线. (3) 我们在自定义函数时,就不要使用 __开头了. (4) 魔术方法是 ...