数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic
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
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit
Sample Output
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的更多相关文章
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- BZOJ 1018 [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2247 Solved: 706[Submit ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic
线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...
- 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...
- BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)
题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...
- 【BZOJ】1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...
随机推荐
- Raphaël.js学习笔记
Rapheal.js 是一个矢量图绘图库.对于支持HTML5 SVG的浏览器使用SVG绘图,不支持SVG的IE(ie6,7,8)使用VML绘图.所以Raphael.js的兼容性非常好. Raphael ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- MyTask2
先把核心代码贴上 public void solve() { //Console.WriteLine("请输入你需要生成多少人的数据以及年龄最大值(75以内):"); //int ...
- Unity3D 创建一个简单的2D游戏
开始研究Unity3d 中的2D游戏. 首先创建出一个项目: 然后创建出一个场景: 然后添加一个背景: 然后创建一个主人公对象: 可以是自己做的素材,也可以是用unity裁剪的素材, 下面贴出裁剪素材 ...
- iBatis 的删除一条记录
Student.xml 设置删除参数的类型,可以是一个对象的 <delete id="delStudent" parameterClass="int" & ...
- DIV布局之道三:DIV块的覆盖,DIV层遮盖其他DIV
DIV布局网页的第三种方式:覆盖.DIV覆盖方式经常应用于网页弹出框的制作,例如在网店系统中,当用户没有登录时,点击购买,系统弹出一个登陆框. 请看代码: HTML部分: XML/HTML Code复 ...
- asp.net mvc4 使用java异步提交form表单时出现[object object] has no method ajaxSubmit
最近接手了一个单子,说大不大,只是功能不少,开发过程中遇到该问题 先看脚本截图: 本以为是笔误,哪儿写错了,可是看来看去,都没发现有不合适的地方,对比过网上很多代码,都差不多,于是各种方式的,各种原因 ...
- .net版ckeditor配置水印功能(转)
本文简单讲解ckfinder控件给上图片加水印效果. 1.将ckfinder/plugins/watermark/bin/Debug目录下的CKFinder_Watermark.dll和CKFinde ...
- C# ToString常用技巧总结
ToString是在开发中最常用的操作,其作用是将其它类型以字符串类型表示.例如: int i=2;i.ToString() //”2″Object o = new Object();o.ToStri ...
- Magento 2.0 安装
环境: 直接升到最新版PHP5.6.x 刚才开MAC OS PHP 5.5 CENTOS PHP 5.5 composer install 依懒包错误.反复安装组件.还是不行.后来决定重新编释最 ...