【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
null