【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)

题意:一个2行C列的矩形网格图,网格上的每个点代表一个城市,相邻的城市之间有一条道路

一开始每条道路都是堵塞的,堵塞即为不可经过。经过一些操作后,可能某些道路通畅了,也可能某些道路堵塞了

多次询问,询问两个城市是否联通

C,q<=1e5

思路:From https://www.cnblogs.com/MashiroSky/p/5973686.html

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<string>
  4 #include<cmath>
  5 #include<iostream>
  6 #include<algorithm>
  7 #include<map>
  8 #include<set>
  9 #include<queue>
 10 #include<vector>
 11 using namespace std;
 12 typedef long long ll;
 13 typedef unsigned int uint;
 14 typedef unsigned long long ull;
 15 typedef pair<int,int> PII;
 16 typedef vector<int> VI;
 17 #define fi first
 18 #define se second 
 19 #define MP make_pair
 20 #define N   110000
 21 #define M   41
 22 #define eps 1e-8
 23 #define pi acos(-1)
 24 
 25 struct node
 26 {
 27     int U,D,l,r,u,d,p,q;
 28 }t[N<<2];
 29 int n; 
 30 char s[10];
 31 
 32 int read()
 33 { 
 34    int v=0,f=1;
 35    char c=getchar();
 36    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 37    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 38    return v*f;
 39 }
 40 
 41 void pushup(node &p,node l,node r)
 42 {
 43     p.l=l.l|(l.u&p.U&r.l&p.D&l.d);
 44     p.r=r.r|(r.u&p.U&l.r&p.D&r.d);
 45     p.u=(l.u&p.U&r.u)|(l.q&p.D&r.p);
 46     p.d=(l.d&p.D&r.d)|(l.p&p.U&r.q);
 47     p.q=(l.u&p.U&r.q)|(l.q&p.D&r.d);
 48     p.p=(l.d&p.D&r.p)|(l.p&p.U&r.u);
 49 }
 50 
 51 void build(int l,int r,int p)
 52 {
 53     if(l==r)
 54     {
 55         t[p].U=t[p].D=t[p].u=t[p].d=1;
 56         return;
 57     }
 58     int mid=(l+r)>>1;
 59     build(l,mid,p<<1);
 60     build(mid+1,r,p<<1|1);
 61 }
 62 
 63 void updater(int l,int r,int x,int y,int v,int p)
 64 {
 65     int mid=(l+r)>>1;
 66     if(x==mid)
 67     {
 68         if(y==1) t[p].U=v;
 69          else t[p].D=v;
 70          pushup(t[p],t[p<<1],t[p<<1|1]);
 71          return;
 72     }
 73     if(x<=mid) updater(l,mid,x,y,v,p<<1);
 74      else updater(mid+1,r,x,y,v,p<<1|1);
 75     pushup(t[p],t[p<<1],t[p<<1|1]);
 76 }
 77 
 78 void updatec(int l,int r,int x,int v,int p)
 79 {
 80     int mid=(l+r)>>1;
 81     if(l==r)
 82     {
 83         t[p].l=t[p].r=t[p].p=t[p].q=v;
 84         return;
 85     }
 86     if(x<=mid) updatec(l,mid,x,v,p<<1);
 87      else updatec(mid+1,r,x,v,p<<1|1);
 88     pushup(t[p],t[p<<1],t[p<<1|1]);
 89 }
 90 
 91 node query(int l,int r,int x,int y,int p)
 92 {
 93     int mid=(l+r)>>1;
 94     if(x<=l&&r<=y) return t[p];
 95     if(y<=mid) return query(l,mid,x,y,p<<1);
 96      else if(x>mid) return query(mid+1,r,x,y,p<<1|1);
 97       else
 98       {
 99           node tmp=t[p];
100         pushup(tmp,query(l,mid,x,y,p<<1),query(mid+1,r,x,y,p<<1|1));
101         return tmp;
102       }
103 }
104 
105 int main()
106 {
107     freopen("bzoj1018.in","r",stdin);
108     freopen("bzoj1018.out","w",stdout);
109     scanf("%d",&n);
110     build(1,n,1);
111     int r1,r2,c1,c2; 
112     while(scanf("%s",s)!=EOF)
113     {
114         if(s[0]=='E') break;
115         scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
116         if(c1>c2)
117         {
118             swap(c1,c2);
119             swap(r1,r2);
120         }
121         if(s[0]=='O')
122         {
123             if(r1==r2) updater(1,n,c1,r1,1,1);
124              else updatec(1,n,c1,1,1);
125         }
126         if(s[0]=='C')
127         {
128             if(r1==r2) updater(1,n,c1,r1,0,1);
129              else updatec(1,n,c1,0,1);
130         }
131         if(s[0]=='A')
132         {
133             node l=query(1,n,1,c1,1),
134                  x=query(1,n,c1,c2,1),
135                  r=query(1,n,c2,n,1);
136             int ans;
137             
138             if(r1==1&&r2==1)
139                  ans=x.u|(l.r&x.p)|(x.q&r.l)|(l.r&x.d&r.l);
140             
141             if(r1==1&&r2==2)
142                 ans=x.q|(l.r&x.d)|(x.u&r.l)|(l.r&x.p&r.l); 
143                 
144             if(r1==2&&r2==1)
145                 ans=x.p|(l.r&x.u)|(x.d&r.l)|(l.r&x.q&r.l);
146             
147             if(r1==2&&r2==2)
148                 ans=x.d|(l.r&x.q)|(x.p&r.l)|(l.r&x.u&r.l);
149             if(ans) printf("Y\n");
150              else printf("N\n");
151         }        
152     }      
153     return 0;
154 }
155      

 

posted on 2018-10-08 20:59  myx12345  阅读(263)  评论(0编辑  收藏  举报

导航