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. 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约

    文章目录 安装IBM Blockchain Platform extension for VS Code 创建一个智能合约项目 理解智能合约 打包智能合约 Local Fabric Ops 安装智能合 ...

  2. 【集群实战】inotify

    1. inotify简介 Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件). linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加 ...

  3. element UI排坑记(一):判断tabs组件是否切换

    之所以将这个问题列在排坑记之中,是因为官方组件的一个属性颇有些隐蔽,这个问题曾经折腾了本人较多时间,始终思维固着,且使用搜索引擎也不容易搜索到答案,故记之.然而实际解决却是相当简单的. 一.问题描述 ...

  4. vue-cli3.0 gui初体验

    为什么80%的码农都做不了架构师?>>>   介绍 新版的vuecli3.0提供了一个vue ui这个命令,这个命令是做什么的呢,这里引用官网的一段介绍 vue ui 你可以通过 v ...

  5. 【Netapp】在模拟器中使用disk removeowner报错

    报错信息如下: Cluster2::storage disk*> removeowner NET-1.43 Error: command failed: Disk NET-1.43 is not ...

  6. 使用Node.js的http-serve搭建本地服务器

    为什么要使用它? 首先,类似于vue-cli创建的项目,都能够实现浏览器中自动刷新,实时查看项目效果.其中的原理在于,webpack这样的工具启动了一个本地服务器,将本机当作一台服务器,这样在浏览器中 ...

  7. elementUI字体图标不显示问题

    原文链接: 点我 自己搭建的Vue项目,没有使用vue-cli,引入elementUI时提示字体图标404,找不到文件,如下错误: GET http://localhost:9090/WEB-INF/ ...

  8. 数学--数论--整除分块(巨TM详细,学不会,你来打我)

    1.概念 从一道例题说起 在介绍整除分块之前,我们先来看一道算数题:已知正整数n,求∑i=1n⌊ni⌋已知正整数n,求∑i=1n⌊ni⌋在介绍整除分块之前,我们先来看一道算数题: 已知正整数n,求∑i ...

  9. P5520 【[yLOI2019] 青原樱】

    P5520 [[yLOI2019] 青原樱]题解 整理博客的时候改了下分类标签,重新审一下 题目传送门 翻了翻题解区,发现基本没和我写的一样的(主要是都比我的写的简单 看题目: 第一眼,数学题:第二眼 ...

  10. muduo网络库源码学习————互斥锁

    muduo源码的互斥锁源码位于muduo/base,Mutex.h,进行了两个类的封装,在实际的使用中更常使用MutexLockGuard类,因为该类可以在析构函数中自动解锁,避免了某些情况忘记解锁. ...