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. c# 二维码 显示

    需要引用 ThoughtWorks.QRCode.dll 网上可下载 //方法 public ActionResult GenerateQRCode(string content) { try { _ ...

  2. Rouh set 入门知识2(基础定义篇)

    接上一篇,简单说明一下知识库的关系,设K1=(U,S1)和K2=(U,S2)为知识库 1.如果IND(S1)=IND(S2),即U/IND(S1)=U/IND(S2),则知识库K1与知识库K2是等价的 ...

  3. treeview右键添加新节点

    private void advTree1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Righ ...

  4. 借用Toad 生成表空间的使用量图示

    图示产生方法 图示(tablespace uage)如下

  5. winform降低功耗总结

    这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考: 1.使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多2.强制垃圾回收3.多dispose,c ...

  6. Wpf自定义路由事件

    创建自定义路由事件大体可以分为三个步骤: ①声明并注册路由事件. ②为路由事件添加CLR事件包装. ③创建可以激发路由事件的方法. 以ButtonBase类中代码为例展示这3个步骤: public a ...

  7. Oauth认证简介

    Oauth是什么: 1.Oauth是一种安全认证的协议: 2.Oauth为用户资源的授权提供了一个安全的.开放而又简易的标准: 3.Oauth的授权不会使第三方触及到用户的账号信息(用户名和密码). ...

  8. CentOS7下安装配置vncserver

    之前试了xmanager,不过好像和在centos6有很大不同,居然没成功,然后找到了vncserver,试了下,成了 参考:http://blog.csdn.net/jiangliqing1234/ ...

  9. 极光推送 api ios参数问题

    这是首个app项目,推送用的是极光推送jpush 由于用官方文档出现接收多条的问题,在网上找到一套封装好的,非常感觉这位开发者 //推送.指定人error_reporting(E_ALL^E_NOTI ...

  10. php之购物车类思路及代码

    <?php /* 购物车类 1.整站范围内,购物车--全局有效 解决:把购物车的信息,放在session里 2.既然全局有效,购物车的实例只有一个 解决:单例模式 技术选型:session+单例 ...