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
线段树中区间[l, r]存储(1, l)、(2, l)、(1, r)、(2, r)四个点两两间的连通性,总共有6种
合并:
横向边用2个数组ru和rd保存,用于合并,对于6个连通性,一一合并
修改:
修改横向边时,修改ru和rd数组,然后从下往上合并
修改纵向边时,修改该区间内四种状态,然后从下往上合并
查询:
优于可能存在这样的情况:
所以[1,c1],[c1,c2],[c2,n]的连通情况都要算出来
然后根据r1,r2判断就行了
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct Data
{
bool luru,lurd,luld,ldru,ldrd,rurd;
}c[];
bool ru[],rd[];
int n;
char s[];
Data merge(Data dl,Data dr,int mid)
{
Data dm;
dm.luru=(dl.luru&ru[mid]&dr.luru)||(dl.lurd&rd[mid]&dr.ldru);
dm.lurd=(dl.luru&ru[mid]&dr.lurd)||(dl.lurd&rd[mid]&dr.ldrd);
dm.luld=(dl.luld)||(ru[mid]&&rd[mid]&&dl.luru&&dl.ldrd&&dr.luld);
dm.ldru=(dl.ldru&&ru[mid]&&dr.luru)||(dl.ldrd&&rd[mid]&&dr.ldru);
dm.ldrd=(dl.ldrd&&rd[mid]&&dr.ldrd)||(dl.ldru&&ru[mid]&&dr.lurd);
dm.rurd=(dr.rurd)||(ru[mid]&&rd[mid]&&dr.luru&&dr.ldrd&&dl.rurd);
return dm;
}
void update1(int rt,int l,int r,int x,bool up,bool k)
{
if (l==r)
{
if (up) ru[x]=k;
else rd[x]=k;
return;
}
int mid=(l+r)>>;
if (x<=mid) update1(rt<<,l,mid,x,up,k);
else update1(rt<<|,mid+,r,x,up,k);
c[rt]=merge(c[rt<<],c[rt<<|],mid);
}
void update2(int rt,int l,int r,int x,bool k)
{
if (l==r)
{
c[rt].luld=c[rt].rurd=c[rt].lurd=c[rt].ldru=k;
return;
}
int mid=(l+r)>>;
if (x<=mid) update2(rt<<,l,mid,x,k);
else update2(rt<<|,mid+,r,x,k);
c[rt]=merge(c[rt<<],c[rt<<|],mid);
}
Data query(int rt,int l,int r,int L,int R)
{
if (l==L&&r==R)
{
return c[rt];
}
int mid=(l+r)>>;
if (L>mid) return query(rt<<|,mid+,r,L,R);
else if (R<=mid) return query(rt<<,l,mid,L,R);
else
{
return merge(query(rt<<,l,mid,L,mid),query(rt<<|,mid+,r,mid+,R),mid);
}
}
void build(int rt,int l,int r)
{
if (l==r)
{
c[rt].luru=;c[rt].ldrd=;
return;
}
int mid=(l+r)>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
}
int main()
{int i,r1,r2,c1,c2;
cin>>n;
build(,,n);
for (i=;i<n;i++)
ru[i]=rd[i]=;
while ()
{
scanf("%s",s);
scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
if (c1>c2) swap(c1,c2),swap(r1,r2);
if (s[]=='E') break;
if (s[]=='O')
{
if (r1==r2)
update1(,,n,c1,r1==,);
else update2(,,n,c2,);
}
else if (s[]=='C')
{
if (r1==r2)
update1(,,n,c1,r1==,);
else update2(,,n,c2,);
}
else
{
Data dm=query(,,n,c1,c2),dl=query(,,n,,c1),dr=query(,,n,c2,n);
if (r1==&&r2==)
{
bool b1=dm.luru;
bool b2=dl.rurd&dm.ldru;
bool b3=dm.lurd&dr.luld;
bool b4=dl.rurd&dm.ldrd&dr.luld;
if (b1||b2||b3||b4) printf("Y\n");
else printf("N\n");
}
else if (r1==&&r2==)
{
bool b1=dm.ldrd;
bool b2=dl.rurd&dm.lurd;
bool b3=dm.ldru&dr.luld;
bool b4=dl.rurd&dm.luru&dr.luld;
if (b1||b2||b3||b4) printf("Y\n");
else printf("N\n");
}
else if (r1==&&r2==)
{
bool b1=dm.lurd;
bool b2=dl.rurd&dm.ldrd;
bool b3=dm.luru&dr.luld;
bool b4=dl.rurd&dm.ldru&dr.luld;
if (b1||b2||b3||b4) printf("Y\n");
else printf("N\n");
}
else if (r1==&&r2==)
{
bool b1=dm.ldru;
bool b2=dl.rurd&dm.luru;
bool b3=dm.ldrd&dr.luld;
bool b4=dl.rurd&dm.lurd&dr.luld;
if (b1||b2||b3||b4) printf("Y\n");
else printf("N\n");
}
}
}
}

[SHOI2008]堵塞的交通的更多相关文章

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

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Descri ...

  2. BZOJ 1018 [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2247  Solved: 706[Submit ...

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

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

  4. bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...

  5. 【BZOJ1018】[SHOI2008]堵塞的交通

    [BZOJ1018][SHOI2008]堵塞的交通 题面 bzoj 洛谷 洛谷 题解 菊队讲要用线段树维护连通性,但是好像没人写 解法一 将所有的加边删边离线,然后以最近删除时间为边权,$LCT$维护 ...

  6. 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...

  7. 【bzoj1018】[SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2887  Solved: 954[Submit ...

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

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

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

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

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

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

随机推荐

  1. 用C语言协助办公_01 找出所有不对劲的人

    近期想出一系列用C语言协助办公的视频教程,这是第一个.具体的移步:https://chuanke.baidu.com/v6658388-240377-1789288.html

  2. beta冲刺1

    前言:这篇算是开始补之前的开端,毕竟beta阶段我们从前面开始就有在陆续做了. 今天的工作: 接收了新成员*1,然后几个人聚了一下,并且讨论了一下目前遇到的问题,以及目前需要处理的问题. 目前遇到的问 ...

  3. Flask 学习 五 电子邮件

    pip install mail from flask_mail import Mail # 邮件配置 app.config['MAIL_SERVER']='smtp.qq.com' app.conf ...

  4. DML数据操作语言之增加,删除,更新

    1.数据的增加 数据的增加要用到insert语句  ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...

  5. jQuery 写的textarea输入字数限制

    //先判断浏览器是不是万恶的IE        var bind_name = 'input';//默认事件        if (navigator.userAgent.indexOf(" ...

  6. 15-TypeScript策略模式

    在前面的简单工厂模式中,通常将每个类.接口定义到不同的文件中.在面向对象开发思想中有一个重要的原则就是封装变化点,在实际操作过程中, 通常被调用方的代码不要去更改,而是增加,这是面向对象的开闭原则.在 ...

  7. Docker学习笔记 - Docker的远程访问

    学习内容: 配置客户端与守护进程的远程访问 服务端配置-H选项: 使服务端支持远程被访问 客户端使用-H选项: 使客户端访问远程服务端 本地环境DOCKER_HOST设置客户端访问的默认服务端地址 准 ...

  8. linux下mongodb安装、服务器、客户端、备份、账户命令

    在linux环境安装mongoDB: 一般认为偶数版本为稳定版 如 1.6.x,奇数版本为开发版如1.7.x 32bit的mongoDB最大能存放2g的数据,64bit没有限制 方法1: 终端执行: ...

  9. webservice面试题

    webservice是什么? 1.基于WEB的服务,服务端整出一些资源让客户端应用访问(提供数据) 2.webservice是一个跨语言跨平台的规范(抽象) 3.是多个跨语言跨平台的应用间通信整合的方 ...

  10. 关于CheckStyle在eclipse出现的问题

    今天在公司换了一个CheckStyle xml文件.那么我尝试直接import进去新的文件. 在我Check code的时候就爆了下面的错误 o: Failed during checkstyle c ...