1018: [SHOI2008]堵塞的交通traffic

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 3489  Solved: 1168
[Submit][Status][Discuss]

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

HINT

 
http://www.cnblogs.com/Sdchr/p/6104781.html//先贴参考代码
 
大体如下:
将每列作为线段树的叶节点,然后的话节点保存的是其左边界的第一行与右边界的第一行是否联通(a1[0][0])左边界的第一行与右边界的第二行是否联通(a1[0][1])然后一共有a1[2][2]
还有还有左右边界上下是否连通(a2[2]),还有一个神奇的中间联通点b[n<<2][2]表示两个区间的中间部分是否连通b[x][0]是第一行,b[x][1]是第二行。
这种带有区间更新意味的线段树,还有HDU的3308
 
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=+;
char s[];
int x1,x2,y1,y2,c;
struct Segtree{
    struct Status{
    int a1[][],a2[];
    }s[maxn];
    bool b[maxn][];
    int l[maxn],r[maxn],m[maxn];
    Status update(Status s1,Status s2,bool b[]) {
    Status res;
    for(int i=;i<=;++i)
        for(int j=;j<=;++j)
        res.a1[i][j]=(s1.a1[i][]&&b[]&&s2.a1[][j])||(s1.a1[i][]&&b[]&&s2.a1[][j]);
        res.a2[]=(s1.a2[])||(s1.a1[][]&&b[]&&s2.a2[]&&b[]&&s1.a1[][]);
        res.a2[]=(s2.a2[])||(s2.a1[][]&&b[]&&s1.a2[]&&b[]&&s2.a1[][]);
        return res;
    }
    Status access(int x,int y1,int y2){
    if(y1<=l[x]&&r[x]<=y2) return s[x];
    else if(y2<=m[x]) return access(x<<,y1,y2);
    else if(y1>m[x]) return access(x<<|,y1,y2);
    else return update(access(x<<,y1,y2),access(x<<|,y1,y2),b[x]);
    }
    void change(bool k,int x,int x1,int y1,int x2,int y2){
    if(x1==x2&&y1==m[x]) {
        b[x][x1]=k;
        s[x]=update(s[x<<],s[x<<|],b[x]);
    }
    else if(l[x]==r[x]) s[x].a1[][]=s[x].a1[][]=s[x].a2[]=s[x].a2[]=k;
    else {
        change(k,y2<=m[x]?x<<:x<<|,x1,y1,x2,y2);
        s[x]=update(s[x<<],s[x<<|],b[x]);
    }
    }
    void ask(int x1,int y1,int x2,int y2){
    Status left=access(,,y1),right=access(,y2,c),mid=access(,y1,y2);
    bool res=false;
    for(int i=;i<=;++i)
        for(int j=;j<=;++j)
    if(mid.a1[i][j]&&(i==x1||left.a2[])&&(j==x2||right.a2[])) {
        res=true;
        break;
    }
    if(res) puts("Y"); else puts("N");
    }
    void build(int x,int y1,int y2){
    l[x]=y1,r[x]=y2,m[x]=(l[x]+r[x])>>;
    if(y1==y2) s[x].a1[][]=s[x].a1[][]=true;
    else {
        build(x<<,y1,m[x]);
        build(x<<|,m[x]+,y2);
    }
    }
}seg;
int main(){
   scanf("%d",&c);
   seg.build(,,c);
   while(){
    scanf("%s",s);
    if(s[]=='E') break;
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    --x1;--x2;
    if(y1>y2) {
        swap(x1,x2);
        swap(y1,y2);
    }
    if(s[]=='O') seg.change(,,x1,y1,x2,y2);
    else if(s[]=='C') seg.change(,,x1,y1,x2,y2);
    else seg.ask(x1,y1,x2,y2);
   }
   return ;
}
 

BZOJ1018线段树的更多相关文章

  1. 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic

    线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...

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

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

  3. BZOJ1018 SHOI2008堵塞的交通(线段树)

    动态图的连通性当然是可以用LCT维护的.但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢. 考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径 ...

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

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

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

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

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

    题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...

  7. bzoj1018/luogu4246 堵塞的交通 (线段树)

    对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...

  8. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

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

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

随机推荐

  1. 计算2的n次幂htm代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 【Linux常见命令】uname命令

    uname命令用于显示系统信息. uname可显示电脑以及操作系统的相关信息. 语法 uname [-amnrsv][--help][--version] 参数说明: -a或--all 显示全部的信息 ...

  3. PAT A1023

    简单的大数问题,long long并不能容纳21位数字,这是刚开始没有注意到的 #include<iostream> #include<stdlib.h> #include&l ...

  4. 推荐3个Python初学者学习Python案例

    回复资料,获取最新的Python的资料.想学习Python可以加微信回复报名. 希望今天的分享3个小案例,对你学习Python有帮助 Python 九九乘法表 以下实例演示了如何实现九九乘法表: 实例 ...

  5. 使用 html5 FileReader 获取图片, 并异步上传到服务器 (不使用 iframe)

    为什么80%的码农都做不了架构师?>>>   原理: 1.使用FileReader 读取图片的base64编码 2.使用ajax,把图片的base64编码post到服务器. 3.根据 ...

  6. mybatis源码学习(四):动态SQL的解析

    之前的一片文章中我们已经了解了MappedStatement中有一个SqlSource字段,而SqlSource又有一个getBoundSql方法来获得BoundSql对象.而BoundSql中的sq ...

  7. APP路由还能这样玩

    本文主要讲述一种设计思路,组件化架构市面上已经有很多大厂成熟的方案,但是在组件化过程中,偶尔会遇到2个独立业务子模块间没有相互引用,也需要能直接调用对方的功能,因此我想到通过方法路由来解决,如果还有疑 ...

  8. postman(介绍)

    Postman 界面介绍 一. 安装后首次打开 postman,会提示你是否需要登录,登录的话可以云端保存你的收藏及历史记录,不登陆不影响使用.   二. 进入后就是如下图所示的界面了.看到这么多按钮 ...

  9. Java面试题:String、StringBuilder、StringBuffer区别

    String:不可变字符序列. StringBuilder:可变字符序列.效率高.线程不安全,适合单线程. StringBuffer:可变字符序列.效率低.线程安全,适合多线程. 效率从高到低:Str ...

  10. nginx反向代理做负载均衡以及使用redis实现session共享配置详解

    1.为什么要用nginx做负载均衡? 首先我们要知道用单机tomcat做的网站,比较理想的状态下能够承受的并发访问在150到200, 按照并发访问量占总用户数的5%到10%技术,单点tomcat的用户 ...