1018: [SHOI2008]堵塞的交通traffic

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 2638  Solved: 864

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”作为结束。我们假设在一开始所有的道路都是堵塞的。 对30%测试数据,我们保证C小于等于1000,信息条数小于等于1000; 对100%测试数据,我们保证 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
 
  思维要缜密啊。
 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
int n;
bool U[maxn],D[maxn],M[maxn];
bool t[maxn<<][];
bool ret[maxn<<][];
void Push_up(int x){
int l=x<<,r=l|;
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=t[l][]||(t[l][]&&t[l][]&&t[r][]);
t[x][]=t[r][]||(t[r][]&&t[r][]&&t[l][]);
} void Update(int x,int l,int r,int g){
if(l==r){
t[x][]=U[l]||(M[l]&&D[l]&&M[l+]);
t[x][]=D[l]||(M[l]&&U[l]&&M[l+]);
t[x][]=(M[l]&&D[l])||(U[l]&&M[l+]);
t[x][]=(M[l]&&U[l])||(D[l]&&M[l+]);
t[x][]=M[l]||(M[l+]&&U[l]&&D[l]);
t[x][]=M[l+]||(M[l]&&U[l]&&D[l]);
return;
}
int mid=(l+r)>>;
if(mid>=g)Update(x<<,l,mid,g);
else Update(x<<|,mid+,r,g);
Push_up(x);
}
void Query(int x,int l,int r,int a,int b){
if(l>=a&&r<=b){
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
return;
}
int mid=(l+r)>>;
if(mid>=a)Query(x<<,l,mid,a,b);
if(mid<b)Query(x<<|,mid+,r,a,b);
if(mid>=a&&mid<b){
int ls=x<<,rs=ls|;
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=ret[ls][]||(ret[ls][]&&ret[ls][]&&ret[rs][]);
ret[x][]=ret[rs][]||(ret[rs][]&&ret[rs][]&&ret[ls][]);
}
else{
if(mid>=a){
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
}
else{
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
}
}
}
bool Solve(int x1,int y1,int x2,int y2){
if(y1==y2){
if(x1==x2)return true;
bool re=M[y1];
if(y1<=n){
Query(,,n,y1,n);
re|=ret[][];
}
if(y1>=){
Query(,,n,,y1-);
re|=ret[][];
}
return re;
}
bool t1[],t2[],t3[];
memset(t1,,sizeof(t1));
memset(t3,,sizeof(t3));
if(<=y1-){
Query(,,n,,y1-);
memcpy(t1,ret[],sizeof(ret[]));
}
Query(,,n,y1,y2-);
memcpy(t2,ret[],sizeof(ret[]));
if(y2<=n){
Query(,,n,y2,n);
memcpy(t3,ret[],sizeof(ret[]));
}
if(x1==x2){
if(x1==)
return t2[]||(t1[]&&t2[])||(t3[]&&t2[])||(t1[]&&t2[]&&t3[]);
else
return t2[]||(t1[]&&t2[])||(t3[]&&t2[])||(t1[]&&t2[]&&t3[]);
}
else{
if(x1==)
return t2[]||(t1[]&&t2[])||(t3[]&&t2[]);
else
return t2[]||(t1[]&&t2[])||(t3[]&&t2[]);
}
} int main(){
freopen("traffic.in","r",stdin);
freopen("traffic.out","w",stdout);
int x1,y1,x2,y2;
char op[];
scanf("%d",&n);n--;
while(true){
scanf("%s",op);
if(!strcmp(op,"Exit"))break;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(y1>y2){swap(x1,x2);swap(y1,y2);}
if(!strcmp(op,"Close")){
if(x1==x2)
if(x1==)U[y1]=false;
else D[y1]=false;
else M[y1]=false;
Update(,,n,y1);
if(y1!=y2)Update(,,n,y2);
if(y1-)Update(,,n,y1-);
}
else if(!strcmp(op,"Open")){
if(x1==x2)
if(x1==)
U[y1]=true;
else
D[y1]=true;
else
M[y1]=true;
Update(,,n,y1);
if(y1!=y2)Update(,,n,y2);
if(y1-)Update(,,n,y1-);
}
else if(!strcmp(op,"Ask"))
printf("%c\n",Solve(x1,y1,x2,y2)?'Y':'N');
}
return ;
}

数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic的更多相关文章

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

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

  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 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

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

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...

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

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

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

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

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

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

  8. BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)

    题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...

  9. 【BZOJ】1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...

随机推荐

  1. href与src的区别

    src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素. href ...

  2. linux 命令终端提示符显示-bash-4.1#解决方法

    昨天在配置linux,突然发现root登录的CRT的终端提示符显示的是-bash-4.1# 而不是root@主机名 + 路径的显示方式.搞了半天也不知道为什么出现这种情况.今天终于搞定这个问题, 原因 ...

  3. LiLei&HanMeiMei的隐式马尔可夫爱情

    一篇非常棒的隐马尔可夫入门文章...推荐! from: http://staffwww.dcs.shef.ac.uk/people/W.Liu/hmm.html

  4. C#总结项目《影院售票系统》编写总结一

    C#学习经历从基本语法结构到窗体再到面向对象终于走完了.NET初级程序员的道路,做为品德优良好学生更不能落下课程的总结项目-某某鸟<影院售票系统>.用了大概一天半的时间做完这个练手项目,先 ...

  5. SpringSecurity 在MVC 中的简单使用(翻译的,稍加改动)

    Spring Security允许开发人员轻松地将安全功能集成到J2EE Web应用程序中,它通过Servlet过滤器实现“用户自定义”安全检查. 在本教程中,我们将向您展示如何在Spring MVC ...

  6. 原生JS+tween.js模仿微博发布效果

    转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4816865.html 1.先看效果吧,有效果才有动力: 2.html结构: <!DOCTYPE ht ...

  7. jquery几个常用的demo

    新建两个页面.一个叫做  ---- demo1.js------- 一个叫做 ----- demo1.html----- 代码分别如下 <!DOCTYPE html> <html l ...

  8. Maven搭建Spring+Struts2+Hibernate项目详解

    http://www.bubuko.com/infodetail-648898.html

  9. vpn的作用

    1.可以用于远程对方桌面. 步骤: 1.浏览器中访问网址,输入用户名,密码即可 2.输入远程桌面用户名和网址

  10. 十三、C# 事件

    1.多播委托 2.事件 3.自定义事件   在上一章中,所有委托都只支持单一回调. 然而,一个委托变量可以引用一系列委托,在这一系列委托中,每个委托都顺序指向一个后续的委托, 从而形成了一个委托链,或 ...