【SHOI 2008】【BZOJ 1018】堵塞的交通traffic
2015-07-11 16:38
459 查看
发现很多有关区间联通问题的题线段树都可以做,不论是1列还是2列。这题的易错点在于两个端点x,yx,y之间的可行路径不一定在区间[x,y][x,y]之间,有可能是从其他区间绕过来的,想明白这一点,区间的更新又与1列的情况基本类似,这题就很好做了。
code:
code:
[code]#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define mid (l+r)/2 #define lch i<<1,l,mid #define rch i<<1|1,mid+1,r using namespace std; struct hp{ bool uuf,udf,ddf,duf,lf,rf; bool luf,ldf,ruf,rdf; }seg[400001]; int n; bool t; void updata(int i) { bool a,b; seg[i].luf=seg[i<<1].luf; seg[i].ldf=seg[i<<1].ldf; seg[i].ruf=seg[i<<1|1].ruf; seg[i].rdf=seg[i<<1|1].rdf; a=seg[i<<1].udf&seg[i<<1|1].duf&seg[i<<1].rdf; b=seg[i<<1].uuf&seg[i<<1|1].uuf&seg[i<<1].ruf; seg[i].uuf=a|b; a=seg[i<<1].duf&seg[i<<1|1].udf&seg[i<<1].ruf; b=seg[i<<1].ddf&seg[i<<1|1].ddf&seg[i<<1].rdf; seg[i].ddf=a|b; a=seg[i<<1].ddf&seg[i<<1|1].duf&seg[i<<1].rdf; b=seg[i<<1].duf&seg[i<<1|1].uuf&seg[i<<1].ruf; seg[i].duf=a|b; a=seg[i<<1].uuf&seg[i<<1|1].udf&seg[i<<1].ruf; b=seg[i<<1].udf&seg[i<<1|1].ddf&seg[i<<1].rdf; seg[i].udf=a|b; a=seg[i<<1].lf; b=seg[i<<1].uuf&seg[i<<1|1].lf&seg[i<<1|1].luf&seg[i<<1|1].ldf&seg[i<<1].ddf; seg[i].lf=a|b; a=seg[i<<1|1].rf; b=seg[i<<1|1].uuf&seg[i<<1].rf&seg[i<<1].ruf&seg[i<<1].rdf&seg[i<<1|1].ddf; seg[i].rf=a|b; } void build(int i,int l,int r) { if (l==r) { seg[i].uuf=seg[i].ddf=true; return; } build(lch); build(rch); updata(i); } void insert(int i,int l,int r,int x,int plc,int dir,int a) { if (l==x&&l==r) { if (plc==0) seg[i].udf=seg[i].duf=seg[i].lf=seg[i].rf=a; if (plc==1) { if (dir==1) seg[i].ruf=a; if (dir==2) seg[i].luf=a; } if (plc==2) { if (dir==1) seg[i].rdf=a; if (dir==2) seg[i].ldf=a; } return; } if (x<=mid) insert(lch,x,plc,dir,a); else insert(rch,x,plc,dir,a); updata(i); } hp query(int i,int l,int r,int x,int y) { bool fl=false,fr=false; bool a,b; hp tl,tr,t; if (x<=l&&y>=r) return seg[i]; if (x<=mid) {fl=true; tl=query(lch,x,y);} if (y>mid) {fr=true; tr=query(rch,x,y);} if (fl&&!fr) t=tl; if (!fl&&fr) t=tr; if (fl&&fr) { t.luf=tl.luf; t.ldf=tl.ldf; t.ruf=tr.ruf; t.rdf=tr.rdf; a=tl.uuf&tr.uuf&tl.ruf; b=tl.udf&tr.duf&tl.rdf; t.uuf=a|b; a=tl.ddf&tr.ddf&tl.rdf; b=tl.duf&tr.udf&tl.ruf; t.ddf=a|b; a=tl.uuf&tr.udf&tl.ruf; b=tl.udf&tr.ddf&tl.rdf; t.udf=a|b; a=tl.ddf&tr.duf&tl.rdf; b=tl.duf&tr.uuf&tl.ruf; t.duf=a|b; a=tl.lf; b=tl.uuf&tr.luf&tr.lf&tr.ldf&tl.ddf; t.lf=a|b; a=tr.rf; b=tr.uuf&tl.ruf&tl.rf&tl.rdf&tl.ddf; t.rf=a|b; } return t; } int main() { int i,x1,x2,y1,y2; bool a,b,c,d,ans; bool fl,fr; hp ansmid,ansl,ansr; char s[10]; scanf("%d",&n); memset(seg,false,sizeof(seg)); build(1,1,n); scanf("%s",&s); while (s[0]!='C'&&s[0]!='O'&&s[0]!='A'&&s[0]!='E') {scanf("%s",&s);} while (s[0]!='E') { if (s[0]=='C') { scanf("%d%d%d%d",&y1,&x1,&y2,&x2); if (x1==x2) insert(1,1,n,x1,0,0,0); else { insert(1,1,n,min(x1,x2),y1,1,0); insert(1,1,n,max(x1,x2),y1,2,0); } } if (s[0]=='O') { scanf("%d%d%d%d",&y1,&x1,&y2,&x2); if (x1==x2) insert(1,1,n,x1,0,0,1); else { insert(1,1,n,min(x1,x2),y1,1,1); insert(1,1,n,max(x1,x2),y1,2,1); } } if (s[0]=='A') { scanf("%d%d%d%d",&y1,&x1,&y2,&x2); if (x1>x2) {swap(x1,x2); swap(y1,y2); } fl=fr=ans=false; if (1<=x1-1) {ansl=query(1,1,n,1,x1-1); fl=true;} ansmid=query(1,1,n,x1,x2); if (x2+1<=n) {ansr=query(1,1,n,x2+1,n); fr=true;} if (y1==1&&y2==1) { a=ansmid.uuf; b=fl&ansl.rf&ansl.ruf&ansl.rdf&ansmid.duf; c=fr&ansr.lf&ansr.luf&ansr.ldf&ansmid.udf; d=fl&fr&ansl.rf&ansr.lf&ansmid.ddf&ansl.ruf&ansl.rdf&ansr.ldf&ansr.luf; ans=a|b|c|d; } if (y1==2&&y2==2) { a=ansmid.ddf; b=fl&ansl.rf&ansl.ruf&ansl.rdf&ansmid.udf; c=fr&ansr.lf&ansr.luf&ansr.ldf&ansmid.duf; d=fl&fr&ansl.rf&ansr.lf&ansmid.uuf&ansl.ruf&ansl.rdf&ansr.ldf&ansr.luf; ans=a|b|c|d; } if (y1==1&&y2==2) { a=ansmid.udf; b=fl&ansl.rf&ansl.ruf&ansl.rdf&ansmid.ddf; c=fr&ansr.lf&ansr.ldf&ansr.luf&ansmid.uuf; d=fl&fr&ansl.rf&ansr.lf&ansmid.duf&ansl.ruf&ansl.rdf&ansr.ldf&ansr.luf; ans=a|b|c|d; } if (y1==2&&y2==1) { a=ansmid.duf; b=fl&ansl.rf&ansl.ruf&ansl.rdf&ansmid.uuf; c=fr&ansr.lf&ansr.luf&ansr.ldf&ansmid.ddf; d=fl&fr&ansl.rf&ansr.lf&ansmid.udf&ansl.ruf&ansl.rdf&ansr.ldf&ansr.luf; ans=a|b|c|d; } if (ans) printf("Y\n"); else printf("N\n"); } scanf("%s",&s); while (s[0]!='C'&&s[0]!='O'&&s[0]!='A'&&s[0]!='E') {scanf("%s",&s);} } }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- MES 功能清单
- MySQL多表连接删除问题
- HTML中为什么要清除浮动的个人理解
- MSP430推荐网站
- Mac版QQ 无法截图处理方法
- shell 入门教程
- Scrapy研究和探索(七)——如何防止被ban大集合策略
- Selenium webdriver 封装与重用
- C3_循环结构
- Java tutorial 6
- HDU_5104
- SpringMVC源码剖析(五)-消息转换器
- 欢迎使用CSDN-markdown编辑器
- MSP430F149学习之路——UART
- Selenium webdriver 高级应用
- 剖析springmvc之HelloWorld
- ThinkingInJava 学习笔记 002
- 我认识的PE文件之相对虚拟地址 + 文件偏移地址
- Selenium webdriver 元素操作