描述

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. 阻止a标签跳转/刷新

    <a href='javascript:;' onClick='functionA()'>点击</a> //注意":"."’":均需为英 ...

  2. java笔试之放苹果

    题目描述:M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入:每个用例包含二个整数M和N.0<=m< ...

  3. [记录]学习树莓派3B接DHT11和LCD1602和修改树莓派时区

    前提 树莓派系统安装好 apache web 服务器,如未安装,可在树莓派内执行sudo apt-get install apache2 进行安装apache 也可以通过命令获取GPIO信息: gpi ...

  4. css3 ---2 属性的选择器

    存在和值属性选择器1:[attr]:该选择器选择包含 attr 属性的所有元素,不论 attr 的值为何. [name]{ background: pink; } <!DOCTYPE html& ...

  5. threading.local在flask中的用法

    一.介绍 threading.local的作用: 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据的存储,而每块空间内的数据也不会错乱. 二.不使用threading. ...

  6. 移动端自定义键盘的vue组件 ----keyboard

    <style scoped lang="less"> .keyboard { /* height: 250px; */ width: 100%; position: f ...

  7. Js中的onblur和onfocus事件应用介绍

    html页面中,诸如按钮.文本框等可视元素都具有拥有和失去焦点的事件,本文以文本框获得和失去焦点为例简单讲解onfocus和onblur的应用 html页面中,诸如按钮.文本框等可视元素都具有拥有和失 ...

  8. 密码学笔记(5)——Rabin密码体制和语义安全性

    一.Rabin密码体制 Rabin密码体制是RSA密码体制的一种,假定模数$n=pq$不能被分解,该类体制对于选择明文攻击是计算安全的.因此,Rabin密码体制提供了一个可证明安全的密码体制的例子:假 ...

  9. java基础之final关键字

    final: 意为终态.在java中得注意以下四点: 1.final是一个修饰符,可修饰变量,方法,类. 2.final修饰子类不可以被继承. 3.final修饰的方法不可以被重写(覆盖) 4.对于一 ...

  10. NopCommerce3.9安装

    除非另外说明,否则本分类所有博文的NopCommerce都基于3.9版本. 用vs2015打开,其他版本的vs没试过. 首先打开解决方案,然后设置Nop.web为启动项目. 启动项目,项目即可自动编译 ...