题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1018

题意:一个2*n的格子,相邻格子之间有一条道路。初始时道路是不通的。 三种操作:(1)某条道路连起来;(2)某条道路断开;(3)询问某两个格子是否相连。

思路:(1)首先,线段树的节点保存[L,R]区间两端的四个格子的连通情况,共六种,另外还要保存[L,mid],[mid+1,R]这两段之间的连通情况,即格子(1,mid)和(1,mid+1)以及(2,mid)和(2,mid+1)是否连接;

(2)查询[L,R]时,有可能L直接与R相连,也有可能L向前走再回来,或者R向后走再回来。查询p=[1,L],r=[L,R],q=[R,n]。那么p的右侧两个格子相连或者r的左侧两个格子相连,则r的左侧两个格子相连;q的左侧两个格子相连或者r的右侧两个格子相连,则r的右侧两个格子相连。此时利用r的四个格子的连通情况就可以判断询问的两个格子是否连通。

(3)修改时,x1=x2,则两个格子为同一行相邻格子,否则为同一列的两个格子。

struct Node
{
    int lb,rb,b[2][2];
};

struct node
{
    int b0,b1,L,R,mid;
    Node b;
};

node a[N<<2];

Node merge(Node a,Node b,int b0,int b1)
{
    Node ans;
    ans.lb=a.lb||(a.b[0][0]&&b0&&b.lb&&b1&&a.b[1][1]);
    ans.rb=b.rb||(b.b[0][0]&&b0&&a.rb&&b1&&b.b[1][1]);
    clr(ans.b,0);
    int i,j;
    if(b0) FOR0(i,2) FOR0(j,2) ans.b[i][j]|=a.b[i][0]&&b.b[0][j];
    if(b1) FOR0(i,2) FOR0(j,2) ans.b[i][j]|=a.b[i][1]&&b.b[1][j];
    return ans;
}

void build(int t,int L,int R)
{
    a[t].L=L;
    a[t].R=R;
    a[t].mid=(L+R)>>1;
    if(L==R)
    {
        a[t].b.b[0][0]=a[t].b.b[1][1]=1;
        return;
    }
    build(t*2,L,a[t].mid);
    build(t*2+1,a[t].mid+1,R);
}

void update(int t,int x1,int y1,int x2,int y2,int b)
{
    if(x1==x2&&a[t].mid==y1)
    {
        if(x1==0) a[t].b0=b;
        else a[t].b1=b;
        a[t].b=merge(a[t*2].b,a[t*2+1].b,a[t].b0,a[t].b1);
        return;
    }
    if(a[t].L==a[t].R)
    {
        a[t].b.lb=a[t].b.rb=a[t].b.b[0][1]=a[t].b.b[1][0]=b;
        return;
    }
    if(y1<=a[t].mid) update(t*2,x1,y1,x2,y2,b);
    else update(t*2+1,x1,y1,x2,y2,b);
    a[t].b=merge(a[t*2].b,a[t*2+1].b,a[t].b0,a[t].b1);
}

Node query(int t,int L,int R)
{
    if(a[t].L==L&&a[t].R==R) return a[t].b;
    if(R<=a[t].mid) return query(t*2,L,R);
    if(L>a[t].mid) return query(t*2+1,L,R);
    Node p=query(t*2,L,a[t].mid);
    Node q=query(t*2+1,a[t].mid+1,R);
    return merge(p,q,a[t].b0,a[t].b1);
}

int n;

int main()
{
    RD(n); build(1,1,n);
    char op[10];
    int x1,y1,x2,y2;
    Node p,q,r;
    int i,j,ans;
    while(scanf("%s",op),op[0]!='E')
    {
        RD(x1,y1); RD(x2,y2); x1--; x2--;
        if(y1>y2) swap(y1,y2),swap(x1,x2);
        if(op[0]=='C') update(1,x1,y1,x2,y2,0);
        else if(op[0]=='O') update(1,x1,y1,x2,y2,1);
        else
        {
            p=query(1,1,y1);
            q=query(1,y2,n);
            r=query(1,y1,y2);
            if(p.rb) r.lb=1;
            if(q.lb) r.rb=1;
            ans=0;
            FOR0(i,2) FOR0(j,2) if(r.b[i][j])
            {
                if((i==x1||r.lb)&&(j==x2||r.rb)) ans=1;
            }
            if(ans) puts("Y");
            else puts("N");
        }
    }
}

BZOJ 1018 堵塞的交通traffic(线段树)的更多相关文章

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

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submi ...

  2. [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3795  Solved: 1253 [Sub ...

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

    [BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...

  4. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  5. 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set

    题目描述 给出一张2*n的网格图,初始每条边都是不连通的.多次改变一条边的连通性或询问两个点是否连通. 输入 第一行只有一个整数C,表示网格的列数.接下来若干行,每行为一条交通信息,以单独的一行“Ex ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...

  7. Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)

    这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...

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

    [BZOJ1018]堵塞的交通(线段树) 题面 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网 ...

  9. [bzoj1018][SHOI2008]堵塞的交通traffic_线段树

    bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...

随机推荐

  1. jquery JSON的解析方式

    第一次用JSON作为jquery异步请求的传输对象,结果在jquery请求后返回的结果是字符串还是json对象上折腾了半天.等到问题解决了,也大致明白怎么个意思了,归根结底还是对jquery对相关js ...

  2. JS 学习笔记--9---变量-作用域-内存相关

    JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...

  3. 【BZOJ】【1067】 【SCOI2007】降雨量

    思路题 玛雅,这分类讨论快讨论地疯了…… 从huzecong神的题解那里得到的灵感…… 首先考虑最好确定的情况:为true的时候,此时必须同时满足 1.x和y这两年的降雨量已知,且rain[x]< ...

  4. linux centos yum 安装 rar

    linux yum安装rar时,可能会出现无资源的错误,只需把配置好资源即可,具体操作如下: 1.# vi /etc/yum.repos.d/dag.repo 2.将以下内容写入文件中 [dag] n ...

  5. PE文件结构学习

    PE:Portable Executable File Format(可移植的执行体).Windows平台主流可执行文件格式..exe与.dll文件都是PE格式.32位的叫做PE32,64位的叫做PE ...

  6. KMP--路过

    HDU 1358:弄清楚了NEXT,就好解决,还有不要再循环中用strlen;会超 ----------------------我是凑字数的------------------还是不会KMP----- ...

  7. 关于c语言中的字符数组和字符串指针

    先看代码: #include <stdio.h> int main(void) { ] = "; char * strTmp = "abcdefg"; int ...

  8. HDU 4588 Count The Carries(找规律,模拟)

    题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #includ ...

  9. iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...

  10. 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach

    比赛的时候,被题目误导了,题目最后说结果可能很大,要取模,那时就想直接求会TLE的!!! 赛后才知道,坑啊………… 代码如下: #include<iostream> #include< ...