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 here

【思路】

如果不强制在线的话,就是BC上的一道题,可以时光倒流+并查集来做。

加上强制在线,我们将平面图转化为它的对偶图,两点之间删边的操作使得两个平面连通,当对应的两个平面不连通的时候,说明两点之间有环,此时删边后两点依旧连通。并查集维护连通性。

【代码】

 1 #include<cstdio>
 2 #include<iostream>
 3 #define FOR(a,b,c) for(int a=b;a<=c;a++)
 4 using namespace std;
 5
 6 const int N = 1500+10;
 7
 8 int id[N][N],n,K;
 9
10 struct UFS {
11     int fa[N*N];
12     UFS() { FOR(i,0,N*N-1) fa[i]=i; }
13     int Find(int u) {
14         return u==fa[u]? u:fa[u]=Find(fa[u]);
15     }
16     void Union(int u,int v) {
17         u=Find(u),v=Find(v);
18         if(u!=v) fa[u]=v;
19     }
20 } s;
21
22 int main()
23 {
24     scanf("%d%d",&n,&K);
25     int cnt=0;
26     //id[0][..]||id[..][0] <- 0
27     FOR(i,1,n-1) FOR(j,1,n-1)
28         id[i][j]=++cnt;
29     int b,c,e,f,ans=1;
30     char a[2],d[2];
31     FOR(i,1,K) {
32         if(ans)
33             scanf("%d%d%s%d%d%s",&b,&c,&a,&e,&f,&d);
34         else
35             scanf("%d%d%s%d%d%s",&e,&f,&d,&b,&c,&a);
36         if(a[0]==‘N‘) e=b-1,f=c;
37         else e=b,f=c-1;
38         if(ans=(s.Find(id[b][c])!=s.Find(id[e][f])))
39             s.Union(id[b][c],id[e][f]);
40         puts(ans?"TAK":"NIE");
41     }
42     return 0;
43 }
时间: 2024-10-05 20:43:57

bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)的相关文章

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

4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 189  Solved: 122[Submit][Status][Discuss] Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一行包含两个正整数n,k(2<=n<=1500,1<=k&l

【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

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