BZOJ 1018 [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic
Time Limit: 3 Sec Memory Limit: 162 MB
Submit: 2247 Solved: 706
[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”作为结束。我们假设在一开始所有的道路都是堵塞的。 对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
HINT
Source
题解:一道码农题。。。
先考虑一维的情况:很显然窝萌可以用一个线段树来维护连通性,但二维的怎么就想不到呢。。。QAQ。。。
二维同样是满足区间加法的,那窝萌要做的就是使劲讨论就行了。。。码农题嘛。。。
对我的变量进行一下解释:大家看键盘上qwas这这四个键,按方向打出来就是一个方框内的连通性辣~
看了很多题解都用的是神马s[2],v[2],w[2]的,感觉自己好机智呀!

代码们:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define CH for(int d=0;d<2;d++) if(ch[d])
#define lson x->ch[0],L,M
#define rson x->ch[1],M+1,R
using namespace std;
const int maxn=+,maxnode=+;
struct info{bool qa,ws,qw,as,qs,aw;info(){qw=as=true;}void init(){qa=ws=qs=aw=false;qw=as=true;return;}};
struct side{bool qw,as,qa,ws;}op[maxn];
struct node{node*ch[];info a;}seg[maxnode],*nodecnt=seg,*root;
int T,n,r1,r2,c1,c2,dx[]={-,,},dy[]={,,},ql,qr,pos,cv;char s[];
void build(node*&x=root,int L=,int R=n){
x=nodecnt++;if(L==R)return;int M=L+R>>;build(lson);build(rson);return;
}
void merge(info&u,info l,info r,int mid){
u.qa=l.qa||(l.qw&&op[mid].qw&&op[mid].as&&r.qa&&l.as);
u.ws=r.ws||(r.qw&&op[mid].qw&&op[mid].as&&l.ws&&r.as);
u.qw=(l.qw&&op[mid].qw&&r.qw)||(l.qs&&op[mid].as&&r.aw);
u.as=(l.as&&op[mid].as&&r.as)||(l.aw&&op[mid].qw&&r.qs);
u.qs=(l.qs&&op[mid].as&&r.as)||(l.qw&&op[mid].qw&&r.qs);
u.aw=(l.aw&&op[mid].qw&&r.qw)||(l.as&&op[mid].as&&r.aw);
return;
}
void modify(node*&x=root,int L=,int R=n){
if(L==R){
x->a.qa=x->a.ws=x->a.qs=x->a.aw=op[pos].qa;x->a.qw=x->a.as=true;return;
}int M=L+R>>;
if(pos<=M)modify(lson);else modify(rson);
if(x->ch[]&&x->ch[])merge(x->a,x->ch[]->a,x->ch[]->a,M);
else if(x->ch[])x->a=x->ch[]->a;
else if(x->ch[])x->a=x->ch[]->a;
else x->a.init();return;
}
void change(bool f){
if(r1>r2) swap(r1,r2),swap(c1,c2);int dir;
for(int i=;i<;i++)if(c1+dx[i]==c2&&r1+dy[i]==r2)dir=i;
if(dir==) (r2?op[c2].as:op[c2].qw)=f,pos=c2,modify();
else if(dir==) op[c2].qa=f,pos=c2,modify();
else (r1?op[c1].as:op[c1].qw)=f,pos=c1,modify();return;
}
info query(node*x=root,int L=,int R=n){
if(ql<=L&&R<=qr)return x->a;int M=L+R>>;
if(qr<=M)return query(lson);
if(ql>M)return query(rson);
info a=query(lson),b=query(rson),ans;
merge(ans,a,b,M);return ans;
}
void getans(){
if(c1>c2) swap(c1,c2),swap(r1,r2);info pa,pb,pc;
ql=;qr=c1;pa=query();
ql=c1;qr=c2;pb=query();
ql=c2;qr=n;pc=query();
if(r1==r2){
if(r1==){
if(pb.qw||(pa.ws&&pb.aw)||(pb.qs&&pc.qa)||(pa.ws&&pb.as&&pc.qa)) puts("Y");
else puts("N");
}
else{
if(pb.as||(pa.ws&&pb.qs)||(pb.aw&&pc.qa)||(pa.ws&&pb.qw&&pc.qa)) puts("Y");
else puts("N");
}
}
else{
if(r1==){
if(pb.qs||(pa.ws&&pb.as)||(pc.qa&&pb.qw)) puts("Y");
else puts("N");
}
else{
if(pb.aw||(pa.ws&&pb.qw)||(pc.qa&&pb.as)) puts("Y");
else puts("N");
}
}return;
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
void init(){
n=read();build();
return;
}
void work(){
while(){
scanf("%s",s);
if(s[]=='E') break;
r1=read();c1=read();r2=read();c2=read();r1--;r2--;
if(s[]=='O') change();
else if(s[]=='C') change();
else getans();
}
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}
BZOJ 1018 [SHOI2008]堵塞的交通traffic的更多相关文章
- 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2638 Solved: 864 Descri ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- [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 ...
- 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...
- 1018: [SHOI2008]堵塞的交通traffic - BZOJ
Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一 ...
- 【BZOJ】1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...
- BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)
题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...
随机推荐
- WINDOWS UPDAET
相信各位或多或少都知道 Windows Update 功能,Windows 有了它就可以随时升级到最新的程序版本,同时对防止安全威胁也能起到很大的作用 在 Windows 7 中,安装完成首次运行 ...
- Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员
Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员 1. 配置server连接权限 1 2. 配置数据库权限 1 3. 设置表格/视图安全性 2 1. ...
- Linux下查看显示器输出状态以及修改显示器工作模式(复制 or 扩展)
//关闭显示器VGA1xrandr --output VGA1 --off //开启显示器VGA1xrandr --output VGA1 --auto //关闭显示器LVDS1xrandr --ou ...
- 人工智能2:智能Agent
一.Agent基本定义 基于理性行为的Agent是本书人工智能方法的核心.Agent由传感器.执行器两个重要元件组成,具有与环境交互的能力,其能力是通过分析感知序列,经过Agent函数映射到相应的行动 ...
- 95秀-异步http请求完整过程
最终调用时的代码 private void ansyClearApplyInfor() { RequestParams params = new RequestParams() ...
- W3C小组宣布:HTML5标准制定完成
近日,W3C小组宣布已经完成对HTML5标准以及Canvas 2D性能草案的制定,这就意味着开发人员将会有一个稳定的“计划和实施”目标. Web性能工作组已经推出W3C的两个版本建议草案. Navig ...
- fopen,file_get_contents,curl的区别
1. fopen /file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存.但是CURL会自动对DNS信息进行缓存.对同一域名下的网页或者图片的请求只需 ...
- Linux系统文本命令快速登录与退出
Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统,使用完系统后,必须退出系统.用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经系统验证无误后方能进入系统.在系统安装 ...
- bash:ifconfig command not found for contos7.0
CentOS7刚发布,我忍不住把DELL T410从CentOS6升级到CentOS7.好不容易等安装结束后,立即配置网络,然后在yum源上安装环境.可是执行ifconfig的时候系统提示让我傻了眼: ...
- ReactiveCocoa 简单使用
#pragma mark 指令 -(void) instructionDemo { // 创建使能信号 RACSignal * signal = [self.textField.rac_textSig ...