描述

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 切蛋糕(并查集)的更多相关文章

  1. 并查集(我根本不会切板子啊喂QWQ长文)(大雾

    说句实话,我和并查集的缘分还是蛮深的,因为当年学完数论想着找板子题乱做(真是个神奇的找题方式呢),然后就看到了并查集QWQ,看了一会发现是图论就不看了,,,,,,结果还被说是大佬QWQ其实我只是个Na ...

  2. TZOJ 2648 小希的迷宫(并查集)

    描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...

  3. TZOJ 1840 Jack Straws(线段相交+并查集)

    描述 In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the ta ...

  4. [poj-2985]The k-th Largest Group_Treap+并查集

    The k-th Largest Group poj-2985 题目大意:给你n只猫,有两种操作:1.将两只猫所在的小组合并.2.查询小组数第k大的小组的猫数. 注释:1<=n,m<=20 ...

  5. hdu 5458 Stability(树链剖分+并查集)

    Stability Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total ...

  6. 洛谷P3295 萌萌哒 并查集 + ST表

    又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...

  7. bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

  8. 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组

    [BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...

  9. C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 &amp;&amp; 并查集方法)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

随机推荐

  1. Spring Boot 发布 jar 包转为 war 包秘籍。

    Spring Boot是支持发布jar包和war的,但它推荐的是使用jar形式发布.使用jar包比较方便,但如果是频繁修改更新的项目,需要打补丁包,那这么大的jar包上传都是问题.所以,jar包不一定 ...

  2. 第二周课堂笔记2th

    ---恢复内容开始--- 1. 2.索引取单个值 取多个值叫切片, 切片:取多个值 从左到右取值: 原则:顾头不顾尾 1, a[0:3] abc 2, a[-5:-2] abc 3, a[0:-2] ...

  3. 3.在vm上安装centos 7

    在vm上安装centos 7 1.文件 → 新建虚拟机 3.选择安装Linux系统 4. 虚拟机命名,并选择安装的文件夹 5.选择分配的处理器 6.使用网络地址转换 7.默写选项 9.新建虚拟机 10 ...

  4. jsp 引入js、css修改后有缓存不及时更新

    解决:(增加随机版本号) <link rel="stylesheet" type="text/css" href="css/1.css?v=&l ...

  5. memcache 使用手册

    Memcached 教程 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fit ...

  6. 01.MyBatis快速入门

    1.下载jar包 Mybatis包+数据库驱动包 https://github.com/mybatis/mybatis-3/releases 2.新建Java工程并导入jar包 3.创建数据库与表 C ...

  7. 转载别人的ftp,觉得目录结构不错,学习

    开发简单的FTP:1. 用户登陆2. 上传/下载文件3. 不同用户家目录不同4. 查看当前目录下文件5. 充分使用面向对象知识 REDMAE 1 用户登陆 2 3 1.查看用户目录文件 4 2.上传文 ...

  8. 以太坊geth客户端下的一些常用命令

    这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符.在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以 ...

  9. LoadRunner函数的介绍

    LoadRunner函数的介绍 LoadRunner函数 一:通用函数 LoadRunner的通用函数以lr为前缀,可以在任何协议中使用.可以如下分类: 信息相关的函数: lr_error_messa ...

  10. PostgreSQL问题解决--连接数过多

    I am trying to connect to a Postgresql database, I am getting the following Error: Error:org.postgre ...