zoukankan      html  css  js  c++  java
  • 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

    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

    HINT

     

    Source

    题解:一道码农题。。。

    先考虑一维的情况:很显然窝萌可以用一个线段树来维护连通性,但二维的怎么就想不到呢。。。QAQ。。。

    二维同样是满足区间加法的,那窝萌要做的就是使劲讨论就行了。。。码农题嘛。。。

    对我的变量进行一下解释:大家看键盘上qwas这这四个键,按方向打出来就是一个方框内的连通性辣~

    看了很多题解都用的是神马s[2],v[2],w[2]的,感觉自己好机智呀!

    代码们:

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<algorithm>
      5 #include<queue>
      6 #include<cstring>
      7 #define PAU putchar(' ')
      8 #define ENT putchar('
    ')
      9 #define CH for(int d=0;d<2;d++) if(ch[d])
     10 #define lson x->ch[0],L,M
     11 #define rson x->ch[1],M+1,R
     12 using namespace std;
     13 const int maxn=100000+10,maxnode=200000+10;
     14 struct info{bool qa,ws,qw,as,qs,aw;info(){qw=as=true;}void init(){qa=ws=qs=aw=false;qw=as=true;return;}};
     15 struct side{bool qw,as,qa,ws;}op[maxn];
     16 struct node{node*ch[2];info a;}seg[maxnode],*nodecnt=seg,*root;
     17 int T,n,r1,r2,c1,c2,dx[3]={-1,0,1},dy[3]={0,1,0},ql,qr,pos,cv;char s[10];
     18 void build(node*&x=root,int L=1,int R=n){
     19     x=nodecnt++;if(L==R)return;int M=L+R>>1;build(lson);build(rson);return;
     20 }
     21 void merge(info&u,info l,info r,int mid){
     22     u.qa=l.qa||(l.qw&&op[mid].qw&&op[mid].as&&r.qa&&l.as);
     23     u.ws=r.ws||(r.qw&&op[mid].qw&&op[mid].as&&l.ws&&r.as);
     24     u.qw=(l.qw&&op[mid].qw&&r.qw)||(l.qs&&op[mid].as&&r.aw);
     25     u.as=(l.as&&op[mid].as&&r.as)||(l.aw&&op[mid].qw&&r.qs);
     26     u.qs=(l.qs&&op[mid].as&&r.as)||(l.qw&&op[mid].qw&&r.qs);
     27     u.aw=(l.aw&&op[mid].qw&&r.qw)||(l.as&&op[mid].as&&r.aw);
     28     return;
     29 }
     30 void modify(node*&x=root,int L=1,int R=n){
     31     if(L==R){
     32         x->a.qa=x->a.ws=x->a.qs=x->a.aw=op[pos].qa;x->a.qw=x->a.as=true;return;
     33     }int M=L+R>>1;
     34     if(pos<=M)modify(lson);else modify(rson);
     35     if(x->ch[0]&&x->ch[1])merge(x->a,x->ch[0]->a,x->ch[1]->a,M);
     36     else if(x->ch[0])x->a=x->ch[0]->a;
     37     else if(x->ch[1])x->a=x->ch[1]->a;
     38     else x->a.init();return;
     39 }
     40 void change(bool f){
     41     if(r1>r2) swap(r1,r2),swap(c1,c2);int dir;
     42     for(int i=0;i<3;i++)if(c1+dx[i]==c2&&r1+dy[i]==r2)dir=i;
     43     if(dir==0) (r2?op[c2].as:op[c2].qw)=f,pos=c2,modify();
     44     else if(dir==1) op[c2].qa=f,pos=c2,modify();
     45     else (r1?op[c1].as:op[c1].qw)=f,pos=c1,modify();return;
     46 }
     47 info query(node*x=root,int L=1,int R=n){
     48     if(ql<=L&&R<=qr)return x->a;int M=L+R>>1;
     49     if(qr<=M)return query(lson);
     50     if(ql>M)return query(rson);
     51     info a=query(lson),b=query(rson),ans;
     52     merge(ans,a,b,M);return ans;
     53 }
     54 void getans(){
     55     if(c1>c2) swap(c1,c2),swap(r1,r2);info pa,pb,pc;
     56     ql=1;qr=c1;pa=query();
     57     ql=c1;qr=c2;pb=query();
     58     ql=c2;qr=n;pc=query();
     59     if(r1==r2){
     60         if(r1==0){
     61             if(pb.qw||(pa.ws&&pb.aw)||(pb.qs&&pc.qa)||(pa.ws&&pb.as&&pc.qa)) puts("Y");
     62             else puts("N");
     63         }
     64         else{
     65             if(pb.as||(pa.ws&&pb.qs)||(pb.aw&&pc.qa)||(pa.ws&&pb.qw&&pc.qa)) puts("Y");
     66             else puts("N");
     67         }
     68     }
     69     else{
     70         if(r1==0){
     71             if(pb.qs||(pa.ws&&pb.as)||(pc.qa&&pb.qw)) puts("Y");
     72             else puts("N");
     73         }
     74         else{
     75             if(pb.aw||(pa.ws&&pb.qw)||(pc.qa&&pb.as)) puts("Y");
     76             else puts("N");
     77         }
     78     }return;
     79 }
     80 inline int read(){
     81     int x=0,sig=1;char ch=getchar();
     82     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
     83     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
     84     return x*=sig;
     85 }
     86 inline void write(int x){
     87     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
     88     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
     89     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
     90 }
     91 void init(){
     92     n=read();build();
     93     return;
     94 }
     95 void work(){
     96     while(1){
     97         scanf("%s",s);
     98         if(s[0]=='E') break;
     99         r1=read();c1=read();r2=read();c2=read();r1--;r2--;
    100         if(s[0]=='O') change(1);
    101         else if(s[0]=='C') change(0);
    102         else getans();
    103     }
    104     return;
    105 }
    106 void print(){
    107     return;
    108 }
    109 int main(){init();work();print();return 0;}
  • 相关阅读:
    设计模式学习总结
    WCF一个Host实现多契约服务
    通过服务端监控结果,说说WCF的并发处理
    分词中常用算法比较与设想
    SQL Server 2008建立分区表(Table Partition)
    .NET 4中Entity Framework 新增查询与优化
    Web Service 接口大量数据传输解决方案
    面向对象的设计原则与目标[总结篇]
    说说ADO.NET EF 中的实体修改方法
    数据库大型应用解决方案总结
  • 原文地址:https://www.cnblogs.com/chxer/p/4653564.html
Copyright © 2011-2022 走看看