BZOJ4423 [AMPPZ2013]Bytehattan
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
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
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
NIE
NIE
正解:对偶图+并查集
解题报告:
这道题的思路很巧妙,不失为一种对偶图的灵活运用。
考虑如果没有强制在线的话,直接逆序加边、并查集维护即可。而题目要求强制在线,那么我们需要另辟蹊径(其实做法也是一样的......)。
不妨做出原图的对偶图,每条边对应原图中的一条边,那么可以发现当我处理到某一条边时,如果在对偶图中这条边的对应边连接的两个点(在原图中就是两个面)已经连通了,说明这次删边之后会导致不连通(仔细画画图想想就会发现很有道理);
否则就在并查集中合并即可。所以实现的话就是变删边为加边,同时并查集维护。注意一个细节:原图是水平的话,那么在对偶图中这条边就应该是竖直的。
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = 1511;
const int MAXM = 2500011;
int n,k,a[MAXN][MAXN],father[MAXM],ans,cnt;
char ch[12];
inline void print(){ if(ans==1) printf("TAK\n"); else printf("NIE\n"); }
inline int find(int x){ if(father[x]!=x) father[x]=find(father[x]); return father[x]; }
inline void solve(int x,int y){
int r1,r2;
if(ch[0]=='E') { r1=find(a[x][y-1]); r2=find(a[x][y]); }
else { r1=find(a[x-1][y]); r2=find(a[x][y]); }
if(r1!=r2) father[r1]=r2,ans=1; else ans=0;
print();
} inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void work(){
n=getint(); k=getint(); n--; int lim=n*n; for(int i=1;i<=lim;i++) father[i]=i; ans=1; int x,y;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=++cnt;
while(k--) {
x=getint(); y=getint(); scanf("%s",ch);
if(ans==1) { solve(x,y); x=getint(); y=getint(); scanf("%s",ch); }
else { x=getint(); y=getint(); scanf("%s",ch); solve(x,y); }
}
} int main()
{
work();
return 0;
}
BZOJ4423 [AMPPZ2013]Bytehattan的更多相关文章
- [BZOJ4423][AMPPZ2013]Bytehattan(对偶图+并查集)
建出对偶图,删除一条边时将两边的格子连边.一条边两端连通当且仅当两边的格子不连通,直接并查集处理即可. #include<cstdio> #include<algorithm> ...
- 【BZOJ4423】[AMPPZ2013]Bytehattan 对偶图+并查集
[BZOJ4423][AMPPZ2013]Bytehattan Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v), ...
- 【BZOJ-4423】Bytehattan 并查集 + 平面图转对偶图
4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 144 Solved: 103[Submit][ ...
- BZOJ 4423: [AMPPZ2013]Bytehattan 并查集+平面图转对偶图
4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec Memory Limit: 128 MB Submit: 277 Solved: 183 [Submit ...
- 【bzoj4423】 AMPPZ2013—Bytehattan
http://www.lydsy.com/JudgeOnline/problem.php?id=4423 (题目链接) 题意 给出一个N*N的格点图,m次操作,每次切断U,V之间的边,问切断之后,U, ...
- 【bzoj4423】[AMPPZ2013]Bytehattan(平面图转对偶图+并查集)
题目传送门:bzoj4423 如果是普通的删边判连通性,我们可以很显然的想到把操作离线下来,倒着加边.然而,这题强 制 在 线. 虽然如此,但是题目所给的图是个平面图.那么我们把它转成对偶图试试看? ...
- BZOJ 4423: [AMPPZ2013]Bytehattan
Sol 对偶图+并查集. 思路非常好,将网格图转化成对偶图,在原图中删掉一条边,相当于在对偶图中连上一条边(其实就是网格的格点相互连边),每次加边用并查集维护就可以了. 哦对,还要注意边界就是网格外面 ...
- bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4423 [题意] 给定一个平面图,随时删边,并询问删边后两点是否连通.强制在线. [科普 ...
- BZOJ 4423: [AMPPZ2013]Bytehattan 平面图转对偶图 + 并查集
Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一 ...
随机推荐
- Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理
经过前面的制作,使用Egret的Wing很快完成了开始界面和选关卡界面,下面通常来说就是游戏界面,但此时界面切换和关卡数据还没有准备好,这次讲解界面的切换和关卡数据的解析.前面多次修改了Main.ts ...
- Struts2 框架的快速搭建
方便myEclipse 手动配置Struts2框架,写下此文,需要的朋友拿走不谢~ 一.引入JAR包 WEB工程->WebRoot->WEB-INF->lib引入Struts2对应版 ...
- spring WebSocket详解
场景 websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天.股票交易.游戏 ...
- Qt学习笔记 线程(一)
Qt中的线程是与平台无关的 QThread 提供了创建一个新线程的方法 新建一个线程,继承QThread并重写它的run()当调用 start()函数时会调用重载的run()函数 例: #ifndef ...
- SQL Server Management Studio无法记住密码
用sa账户登录sql server 2008,勾选了“记住密码”,但重新登录时,SQL Server Management Studio无法记住密码. 后来发现,在重新登录时,登录名显示的并非是s ...
- PHP 对于 MYSQL 基础操作
基础 <?php // 不打印 notice info // error_reporting(0); // 连接 mysql $con = mysql_connect("localho ...
- 开源:ASP.NET MVC+EF6+Bootstrap开发框架
前言 我在博客园潜水两三年了,在这里看过很多大神的文章,也学到了很多东西.可以说我是汲取着博客园的营养成长的. 想当年,我也是拿10个G的精神粮食从一个博客园大神那里换来一套开发框架,正式走上开发之路 ...
- 腾讯 or 华为 =》 求职者的困惑
本文目的: 希望有老司机指点迷津 个人背景: 本人软件工程专业,硕士研究生,2017年7月毕业,个人喜欢Java开发,希望有机会从事Java分布式应用开发 故事背景一: 本人2016年4月份参加了腾讯 ...
- C#链接阿里云OCS
一.阿里云OCS简单介绍 阿里云OCS兼容Memcached,因为OCS就相当于Memcached的服务器端,我们代码只是当作客户端,链接上服务器端就行了.阿里云OCS介绍详情见 http://www ...
- Mysql之case语句(附带实例)
这段时间,做项目做累了,好不容易有点个人的学习时间,利用这个小时,总结一下,最近做统计的时候常用的case语句吧. 结构:case when… then …end 1.判断的同时改变其值 eg: ...