描述

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. 17.splash_case02

    # 抓取<我不是药神>的豆瓣评论 import csv import time import requests from lxml import etree fw = open('doub ...

  2. 最全Linux常用命令大全

    查看系统系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMB ...

  3. linux yum 安装 卸载

    安装一个软件时 yum -y install httpd 安装多个相类似的软件时 yum -y install httpd* 安装多个非类似软件时 yum -y install httpd php p ...

  4. 线性回归和梯度下降代码demo

    程序所用文件:https://files.cnblogs.com/files/henuliulei/%E5%9B%9E%E5%BD%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8 ...

  5. 使用phpStudy自带的mysql-front学习建库建表以及基本的mysql语句

    1.鼠标左键phpStudy图标,点击mysql管理器,如下图 2.选择Mysql-Front,选择localhost进入,可以看到本地建立的数据库.然后新建一个数据库,如下图: 3.在新建的数据库上 ...

  6. CI框架 session 不能读取的问题,PHP7环境

    根本原因在这,libraries/Session/Session.php 中 128行: 如果sessionid的长度不是40的话,每次执行都会 unset($_COOKIE[ci_session]) ...

  7. vue-cli 目录结构详细讲解

    https://juejin.im/post/5c3599386fb9a049db7351a8 vue-cli 目录结构详细讲解 目录 结构预览 ├─build // 保存一些webpack的初始化配 ...

  8. VUX的使用方法(以弹出框为例)

    一.安装 cnpm install vux --save cnpm install vux-loader --save-dev 二.配置 const vuxLoader = require('vux- ...

  9. 一个四五年的Java开发程序员,该准备哪些去面试?

    上周面试了一周,感触颇深,总结一下. 面试了公司大概有阿里,携程,爱奇艺,唯品会,途牛,bilibili,大众点评,阿里和爱奇艺是电话面试,其他现场面试. 首先,五年左右,应该算高级开发工程师,大部分 ...

  10. sqlserver2005分页存储过程

    Create proc [dbo].[sp_AbiTableLoad] ---------------------------------------------- -- 单表多表分页存储过程 -- ...