bzoj4423 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)这条边;如果c=E,表示删除(a,b)到(a+1,b)这条边。 数据进行了加密,对于每个操作,如果上一个询问回答为TAK或者这是第一个操作,那么只考虑第一条信息,否则只考虑第二条信息。 数据保证每条边最多被删除一次。

Output

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

用并查集维护网格图所划分出的平面区域的连通性

若一条边(u,v)两侧连通,则删去这条边后u与v不连通,否则边在环上,删去后u与v仍连通

#include<cstdio>
inline int _int(){
    int x=0,c=getchar();
    while(c>‘9‘||c<‘0‘)c=getchar();
    while(c>=‘0‘&&c<=‘9‘)x=x*10+c-48,c=getchar();
    return x;
}
inline char _char(){
    char c=getchar();
    while(c!=‘E‘&&c!=‘N‘)c=getchar();
    return c;
}
int n,k,ans=1;
int id[1503][1503],idp=1;
int f[2300000];
inline int get(int x){
    int a=x,c;
    while(x!=f[x])x=f[x];
    while(x!=(c=f[a]))f[a]=x,a=c;
    return x;
}
int main(){
    n=_int();k=_int();
    for(int i=1;i<n;i++)for(int j=1;j<n;j++)f[idp]=id[i][j]=idp++;
    while(k--){
        int x=_int(),y=_int();
        char c=_char();
        if(ans){
            _int();_int();_char();
        }else{
            x=_int();y=_int();c=_char();
        }
        if(c==‘N‘){
            int a=get(id[x][y]),b=get(id[x-1][y]);
            if(ans=(a!=b))f[a]=b;
        }else{
            int a=get(id[x][y]),b=get(id[x][y-1]);
            if(ans=(a!=b))f[b]=a;
        }
        puts(ans?"TAK":"NIE");
    }
    return 0;
}
时间: 2024-08-11 08:35:37

bzoj4423 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

http://www.lydsy.com/JudgeOnline/problem.php?id=4423 (题目链接) 题意 给出一个N*N的格点图,m次操作,每次切断U,V之间的边,问切断之后,U,V是否还连通. Solution 看到这个题目我就想起了以前写过的一道线段树维护连通性的题.嗯数据范围百万,3秒,nlogn的应该跑得过.那么,二维线段树? 不不不,我是来做平面图的,想想对偶图有没有什么好的性质.考虑每次砍掉平面图一条边就是使对偶图中的两个区域合成了一个区域,就相当于给对偶图中的两

Bzoj4423 [AMPPZ2013]Bytehattan

Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 320  Solved: 214 Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一行包含两个正整数n,k(2<=n<=1500,1<=k<=2n(n-1)),表示网格图的大小以及操作的个数.接下来k行,每行包含两条信息,每条信息包含两个正整

【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,表示删除

[AMPPZ 2013]Bytehattan

先把题目链接贴在这里喵~ http://main.edu.pl/en/archive/amppz/2013/baj 话说真是一道让我严重怀疑我的智商的好题目, 话说此题第一感觉.嗯?似乎离线做做就可以了喵? 诶呦我艹,这个和强制在线一样的感觉是怎么一回事啊! 然后我苦思良久,终于在我他喵的苦思冥想之下,发现了—— 此题果然非我所能破~ 但是看了题解后顿时表示这么多年书白读了TAT 首先原图是平面图,且仅有删边操作 我们维护原图G的对偶图G'的一个子图G'',这个子图的连通性对应了G中各个域(各个

[BZOJ 4423] Bytehattan 平面图与对偶图

题意 给定一个 $n \times n$ 的点阵, 形成一个网格图. 最初的时候四连通. $m$ 次操作, 每次删去一条边 $(u, v)$ , 问 $u$ 和 $v$ 是否仍然连通. $2 \le n \le 1500, 1 \le m \le 2n(n - 1)$ . 分析 将平面图转化为它的对偶图. 每次相当于将两个平面区域合并. 对于删去一条边, 若与它相邻的两个区域连通, 那么操作后两个点中有一个点被区域包围, 一个点被隔在了外面, 所以不连通, 反之仍然连通. 实现 1 #inclu

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)这

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)这

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