【BZOJ1018】堵塞的交通(线段树)

【BZOJ1018】堵塞的交通(线段树)

题面

Description

  有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可
以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个
城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通,
直到拥堵解决,道路才会恢复畅通。初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度
发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入膏肓的小人国交通系统。 小人国的交通
部将提供一些交通信息给你,你的任务是根据当前的交通情况回答查询的问题。交通信息可以分为以下几种格式:
Close r1 c1 r2 c2:相邻的两座城市(r1,c1)和(r2,c2)之间的道路被堵塞了;Open r1 c1 r2 c2:相邻的两座城
市(r1,c1)和(r2,c2)之间的道路被疏通了;Ask r1 c1 r2 c2:询问城市(r1,c1)和(r2,c2)是否连通。如果存在一
条路径使得这两条城市连通,则返回Y,否则返回N;

Input

  第一行只有一个整数C,表示网格的列数。接下来若干行,每行为一条交通信息,以单独的一行“Exit”作为
结束。我们假设在一开始所有的道路都是堵塞的。我们保证 C小于等于100000,信息条数小于等于100000。

Output

  对于每个查询,输出一个“Y”或“N”。

Sample Input

2

Open 1 1 1 2

Open 1 2 2 2

Ask 1 1 2 2

Ask 2 1 2 2

Exit

Sample Output

Y

N

题解

毒瘤题
神题
欢迎入坑

BZOJ上有题解
我只讲线段树如何维护

对于每一个节点
维护的是一段区间
也就是一个矩形
现在我们维护的是这个矩形的四个顶点之间的两两的联通性
这个一顿分类讨论就好了

对于叶子节点,因为会直接的修改边
因此不能够只维护点的连通性
还要维护一下边,
再用边来推出点的连通性再向上递归

每一次的询问
先询问给定的区间
再询问1~左端点以及右端点~n
因为联通的情况无非就是
①在自己的区间内之间联通
②出去走一圈再回来
所以,又是一顿分类讨论,这里就很好解决了

细节太多了,不好细讲
边界情况仔细讨论
可以直接看代码
其中,我的代码
小写的l1,l2,r1,r2分别对应矩形左侧的两个点和右侧的两个点的连通性
L1等大写的表示的边的连通性

这题真是写死我了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 120000
#define lson (now<<1)
#define rson (now<<1|1)
#define rg register
inline int read()
{
    rg int x=0,t=1;rg char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
int n,P;
struct Node
{
    bool l1l2,r1r2,l1r1,l1r2,l2r1,l2r2,L1L2,R1R2,L1R1,L2R2;
    void init(){l1l2=r1r2=l1r1=l1r2=l2r1=l2r2=L1L2=R1R2=L1R1=L2R2=false;}
}t[MAX<<3];
Node Merge(Node x,Node y)
{
    rg Node ret;ret.init();
    ret.l1r1=(x.l1r1&y.l1r1)|(x.l1r2&y.l2r1);
    ret.l2r2=(x.l2r2&y.l2r2)|(x.l2r1&y.l1r2);
    ret.l1l2=(x.l1l2)|(ret.l1r1&ret.l2r2&y.r1r2);
    ret.r1r2=(y.r1r2)|(ret.l1r1&ret.l2r2&x.l1l2);
    ret.l1r2=(x.l1r1&y.l1r2)|(x.l1r2&y.l2r2);
    ret.l2r1=(x.l2r2&y.l2r1)|(x.l2r1&y.l1r1);
    return ret;
}
void Count(Node &a)
{
    a.l1r1=(a.L1R1)|(a.L1L2&a.L2R2&a.R1R2);
    a.l2r2=(a.L2R2)|(a.L1L2&a.L1R1&a.R1R2);
    a.l1l2=(a.L1L2)|(a.L1R1&a.R1R2&a.L2R2);
    a.r1r2=(a.R1R2)|(a.L1R1&a.L1L2&a.L2R2);
    a.l1r2=(a.L1R1&a.R1R2)|(a.L1L2&a.L2R2);
    a.l2r1=(a.L1L2&a.L1R1)|(a.L2R2&a.R1R2);
}
void Modify_C(int now,int l,int r,int pos)
{
    if(l==r)
    {
        if(P==1)t[now].L1R1=false;
        else if(P==2)t[now].L2R2=false;
        else if(P==3)t[now].L1L2=false;
        else if(P==4)t[now].R1R2=false;
        Count(t[now]);
        return;
    }
    rg int mid=(l+r)>>1;
    if(pos<=mid)Modify_C(lson,l,mid,pos);
    else Modify_C(rson,mid+1,r,pos);
    t[now]=Merge(t[lson],t[rson]);
}
void Modify_O(int now,int l,int r,int pos)
{
    if(l==r)
    {
        if(P==1)t[now].L1R1=true;
        else if(P==2)t[now].L2R2=true;
        else if(P==3)t[now].L1L2=true;
        else if(P==4)t[now].R1R2=true;
        Count(t[now]);
        return;
    }
    rg int mid=(l+r)>>1;
    if(pos<=mid)Modify_O(lson,l,mid,pos);
    else Modify_O(rson,mid+1,r,pos);
    t[now]=Merge(t[lson],t[rson]);
}
Node Query(int now,int l,int r,int al,int ar)
{
    if(l==al&&r==ar)return t[now];
    rg int mid=(l+r)>>1;
    if(ar<=mid)return Query(lson,l,mid,al,ar);
    if(al>mid)return Query(rson,mid+1,r,al,ar);
    return Merge(Query(lson,l,mid,al,mid),Query(rson,mid+1,r,mid+1,ar));
}
int main()
{
    n=read()-1;
    rg char ch[20];
    while(233)
    {
        scanf("%s",ch);if(ch[0]=='E')break;
        else if(ch[0]=='O')
        {
            rg int r1=read(),c1=read(),r2=read(),c2=read();
            if(c1>c2)swap(r1,r2),swap(c1,c2);
            if(r1==r2&&r1==1)P=1,Modify_O(1,1,n,c1);
            else if(r1==r2&&r1==2)P=2,Modify_O(1,1,n,c1);
            else if(c1==c2){if(c1!=1){P=4,Modify_O(1,1,n,c1-1);}if(c1<=n)P=3,Modify_O(1,1,n,c1);}
        }
        else if(ch[0]=='C')
        {
            rg int r1=read(),c1=read(),r2=read(),c2=read();
            if(c1>c2)swap(r1,r2),swap(c1,c2);
            if(r1==r2&&r1==1)P=1,Modify_C(1,1,n,c1);
            else if(r1==r2&&r1==2)P=2,Modify_C(1,1,n,c1);
            else if(c1==c2){if(c1!=1){P=4,Modify_C(1,1,n,c1-1);}if(c1<=n)P=3,Modify_C(1,1,n,c1);}
        }
        else
        {
            rg int r1=read(),c1=read(),r2=read(),c2=read();
            if(c1>c2)swap(r1,r2),swap(c1,c2);
            if(c1==c2)
            {
                if(r1 ==r2)puts("Y");
                else
                {
                    rg Node x,y;x.init();y.init();
                    if(c1>1)(x=Query(1,1,n,1,c1-1));
                    if(c1<=n)(y=Query(1,1,n,c1,n));
                    (x.r1r2||y.l1l2)?puts("Y"):puts("N");
                }
                continue;
            }
            rg Node x,y,z;x.init();y.init();z.init();
            x=Query(1,1,n,c1,c2-1);if(c1>=2)y=Query(1,1,n,1,c1-1);if(c2<=n)z=Query(1,1,n,c2,n);
            if(r1==r2)
            {
                if(r1==1)((x.l1r1)||(y.r1r2&&(x.l2r1||(x.l2r2&&z.l1l2))))?puts("Y"):puts("N");
                else((x.l2r2)||(y.r1r2&&(x.l1r2||(x.l1r1&&z.l1l2))))?puts("Y"):puts("N");
            }
            else
            {
                if(r1==1)((x.l1r2)||(y.r1r2&&x.l2r2)||(x.l1r1&&z.l1l2))?puts("Y"):puts("N");
                else((x.l2r1)||(y.r1r2&&x.l1r1)||(x.l2r2&&z.l1l2))?puts("Y"):puts("N");
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/8168787.html

时间: 2024-07-31 11:36:17

【BZOJ1018】堵塞的交通(线段树)的相关文章

BZOJ 1018--堵塞的交通(线段树)

1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3854  Solved: 1265[Submit][Status][Discuss] Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通

【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树

[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道路会变得不连通,直到拥堵解决,道路才会恢复畅通.初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度发达的

bzoj1018: [SHOI2008]堵塞的交通traffic 线段树

线段树维护每一块左上到左下.右上到右下.左上到右上.左下到右下.左上到右下.左下到右上的联通情况. #include<bits/stdc++.h> #define N 100005 #define M (l+r>>1) #define P (k<<1) #define S (k<<1|1) #define K l,r,k #define L l,M,P #define R M+1,r,S #define Z int l=1,int r=n,int k=1 u

bzoj1018 [SHOI2008]堵塞的交通traffic——线段树

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 线段树竟然还可以这样用! 维护的是一个矩形内部的连通情况,四个顶点之间有6中连通方式: 因为连通情况具有可合并性,所以可以用线段树来维护! 这篇博客写得很好:https://www.cnblogs.com/DUXT/p/6029815.html 茅塞顿开之后看到这篇博客,觉得写得很好呢:https://www.cnblogs.com/MashiroSky/p/5973686.html

[BZOJ 1018][SHOI2008]堵塞的交通traffic(线段树)

Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个 城市和3C-2条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道路会变得不连通, 直到拥堵解决,道路才会恢复畅通.初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度 发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入

BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]

1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submit][Status][Discuss] Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通

BZOJ_1018_[JSOI2008]_交通堵塞traffic_(线段树)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1018 \(2*n\)的距形,起初没有边相连,之后有三种操作: 1.加边. 2.删边. 3.询问某两个点是否联通. 分析 这题太神了... 用线段树维护连通性... 放弃解释清楚了... 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1e5+5; 5 int n,cnt; 6 char s[10];

[BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经典模型. 我们线段树的一个节点表示一个区间的联通性,有 6 个 bool 值,表示这个区间的 4 个角上的点之间的联通性. 然后用两个子区间的联通性和两个子区间之间的连边情况合并出整个区间的联通性. 修改某条边时,先在边的数组中修改,然后从这条边所在的点的线段树叶子开始向上 Update . 询问两

数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic

1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道