BZOJ-4423 : [AMPPZ2013]Bytehattan (对偶图+并查集)

4423: [AMPPZ2013]Bytehattan

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 189  Solved: 122
[Submit][Status][Discuss]

Description

比特哈顿镇有n*n个格点,形成了一个网格图。一开始整张图是完整的。
有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通。

Input

第一行包含两个正整数n,k(2<=n<=1500,1<=k<=2n(n-1)),表示网格图的大小以及操作的个数。
接下来k行,每行包含两条信息,每条信息包含两个正整数a,b(1<=a,b<=n)以及一个字符c(c=N或者E)。
如果c=N,表示删除(a,b)到(a,b+1)这条边;如果c=E,表示删除(a,b)到(a+1,b)这条边。
数据进行了加密,对于每个操作,如果上一个询问回答为TAK或者这是第一个操作,那么只考虑第一条信息,否则只考虑第二条信息。
数据保证每条边最多被删除一次。

Output

输出k行,对于每个询问,如果仍然连通,输出TAK,否则输出NIE。

Sample Input

3 4
2 1 E 1 2 N
2 1 N 1 1 N
3 1 N 2 1 N
2 2 N 1 1 N

Sample Output

TAK
TAK
NIE
NIE

HINT

Source

鸣谢Claris提供试题

将原图改为对偶图,然后并查集

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8 #include <iostream>
 9 #include "algorithm"
10 using namespace std;
11 typedef long long LL;
12 const int MAX=1505;
13 int n,k;
14 int fa[MAX*MAX];
15 int get(int x,int y){
16     if (x>0 && x<n && y>0 && y<n)
17      return (x-1)*(n-1)+y;
18     else return (n-1)*(n-1)+1;
19 }
20 int getfather(int x){
21     if (fa[x]==x)
22      return x;
23     return fa[x]=getfather(fa[x]);
24 }
25 int main(){
26     freopen ("Bytehattan.in","r",stdin);
27     freopen ("Bytehattan.out","w",stdout);
28     int i,j;
29     int x1,y1,x2,y2,x,y;
30     char z1,z2,z;
31     int tx,ty;
32     bool flag;
33     scanf("%d%d",&n,&k);
34     fa[(n-1)*(n-1)+1]=(n-1)*(n-1)+1;
35     for (i=1;i<n;i++)
36      for (j=1;j<n;j++)
37       fa[get(i,j)]=get(i,j);
38     flag=true;
39     while (k--)
40     {scanf("%d %d %c %d %d %c\n",&x1,&y1,&z1,&x2,&y2,&z2);
41      if (flag)
42       x=x1,y=y1,z=z1;
43      else
44       x=x2,y=y2,z=z2;
45      if (z==‘N‘)
46       tx=getfather(get(x,y)),ty=getfather(get(x-1,y));
47      else
48       tx=getfather(get(x,y)),ty=getfather(get(x,y-1));
49      if (tx!=ty)
50       fa[tx]=fa[ty],flag=true;
51      else flag=false;
52      if (flag) puts("TAK");
53      else puts("NIE");
54     }
55     return 0;
56 }
时间: 2024-08-05 19:35:26

BZOJ-4423 : [AMPPZ2013]Bytehattan (对偶图+并查集)的相关文章

【bzoj4423】[AMPPZ2013]Bytehattan 对偶图+并查集

题目描述 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. 输入 第一行包含两个正整数n,k(2<=n<=1500,1<=k<=2n(n-1)),表示网格图的大小以及操作的个数.接下来k行,每行包含两条信息,每条信息包含两个正整数a,b(1<=a,b<=n)以及一个字符c(c=N或者E).如果c=N,表示删除(a,b)到(a,b+1)这条边:如果c=E,表示删除

bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4423 [题意] 给定一个平面图,随时删边,并询问删边后两点是否连通.强制在线. [科普] 设有平面图G=(V,E),满足下列条件的图G'= (V',E') 称为图G的对偶图:G的任一面Ri内有且仅有一点Vi':对G的域Ri和Rj的共同边界Ek,画一条边Ek'=(Vi',Vj')且只与Ek交于一点:若Ek完全处于Ri中,则Vi'有一自环Ek',如下图G'是G的对偶图: From her

bzoj 4423: [AMPPZ2013]Bytehattan

Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一行包含两个正整数n,k(2<=n<=1500,1<=k<=2n(n-1)),表示网格图的大小以及操作的个数. 接下来k行,每行包含两条信息,每条信息包含两个正整数a,b(1<=a,b<=n)以及一个字符c(c=N或者E). 如果c=N,表示删除(a,b)到(a,b+1)这

【bzoj3007】拯救小云公主 二分+对偶图+并查集

题目描述 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务. 但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻. Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line).英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离boss的最短距离

BZOJ 3562: [SHOI2014]神奇化合物 并查集+dfs

点击打开链接 注意到20w条边,但是询问只有1w,所以有很多边是从头到尾不变的. 首先离线处理,将从未删除的边缩点,缩点后的图的点数不会超过2w,对于每一次add或者delete,直接dfs看是否能从a走到b,然后维护一个ans. 数据不强,不然这种复杂度起码要跑10s.. #include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> using namespace st

【bzoj5183】[Baltic2016]Park 离线+对偶图+并查集

题目描述 在Byteland的首都,有一个矩形围栏围起来的公园.在这个公园里树和访客都以一个圆形表示.公园有四个出入口,每个角落一个(1=左下角,2=右下角,3=右上角,4=左上角).访客能通过这些出入口进出公园.访客在同时碰到一个角落的两条边时就可以通过该角落进出公园.访客在公园里可以自由地移动,但他们不能和树和围栏相交.对于每个访客,给定他们进入公园的出入口,你的任务是计算他们能在哪个出入口离开公园. 输入 输入的第一行包含两个整数:n,m:树的数量和访客的数量. 第二行包含两个整数:w,h

bzoj 2733 永无乡 - 并查集 - 线段树

永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪 座,请你输

bzoj 2936 [Poi 1999] 降水 - 并查集

题目传送门 需要root权限的传送门 题目大意 有一个$n\times m$的网格图,每一格都有一个高度.一次降雨过后问最多能积多少水. 考虑算每一高度能储存的水的量. 如果小于等于这个高度的格子和边界连通,那么水就会流走,这一部分不能算入答案. 所以用并查集维护高度小于等于当前高度的格子的连通性.每次答案加已经找到的格子数目减去和边界连通的格子数. Code 1 /** 2 * bzoj 3 * Problem#2936 4 * Accepted 5 * Time: 56ms 6 * Memo

【BZOJ 3674】可持久化并查集加强版&amp;【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之

最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破之. 3:输出判断即可. 难者不会,会者不难,1h前我还在膜这道题,现在吗hhh就当支持下zky学长出的题了. 3673: #include<cstdio> #include<cstring> #include<algorithm> #define read(x) x=ge