[BZOJ1018][SHOI2008]堵塞的交通traffic(线段树)

显然离线可以分治并查集,在线可以LCT,单都没用到只有两行的性质。

线段树,每个点记录一个矩形的四个角的连通情况,合并时讨论各种情况即可。

参考:https://www.cnblogs.com/MashiroSky/p/5973686.html

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define ls (x<<1)
 4 #define rs (ls|1)
 5 #define lson ls,L,mid
 6 #define rson rs,mid+1,R
 7 #define rep(i,l,r) for (int i=(l); i<=(r); i++);
 8 using namespace std;
 9 
10 const int N=100010;
11 char s[10];
12 int n,r1,r2,c1,c2;
13 struct P{ bool U,D,l,r,u,d,q,p; }p[N<<2];
14 
15 void merge(P &x,P L,P R){
16     x.u=(L.u & x.U & R.u) | (L.q & x.D & R.p);
17     x.d=(L.d & x.D & R.d) | (L.p & x.U & R.q);
18     x.q=(L.u & x.U & R.q) | (L.q & x.D & R.d);
19     x.p=(L.p & x.U & R.u) | (L.d & x.D & R.p);
20     x.l=L.l | (L.u & x.U & R.l & x.D & L.d);
21     x.r=R.r | (R.u & x.U & L.r & x.D & R.d);
22 }
23 
24 void build(int x,int L,int R){
25     if (L==R){ p[x]=(P){1,1,0,0,1,1,0,0}; return; }
26     int mid=(L+R)>>1;
27     build(lson); build(rson);
28 }
29 
30 void mdfr(int x,int L,int R,int pos,int k,bool op){
31     int mid=(L+R)>>1;
32     if (mid==pos){
33         if (k==1) p[x].U=op; else p[x].D=op;
34         merge(p[x],p[ls],p[rs]); return;
35     }
36     if (pos<=mid) mdfr(lson,pos,k,op); else mdfr(rson,pos,k,op);
37     merge(p[x],p[ls],p[rs]);
38 }
39 
40 void mdfc(int x,int L,int R,int pos,bool op){
41     if (L==R){ p[x].l=p[x].r=p[x].p=p[x].q=op; return; }
42     int mid=(L+R)>>1;
43     if (pos<=mid) mdfc(lson,pos,op); else mdfc(rson,pos,op);
44     merge(p[x],p[ls],p[rs]);
45 }
46 
47 P que(int x,int L,int R,int l,int r){
48     if (L==l && r==R) return p[x];
49     int mid=(L+R)>>1;
50     if (r<=mid) return que(lson,l,r);
51     else if (l>mid) return que(rson,l,r);
52         else{ P res=p[x]; merge(res,que(lson,l,mid),que(rson,mid+1,r)); return res; }
53 }
54 
55 int main(){
56     freopen("bzoj1018.in","r",stdin);
57     freopen("bzoj1018.out","w",stdout);
58     scanf("%d",&n); build(1,1,n);
59     while (1){
60         scanf("%s",s);
61         if (s[0]=='E') break;
62         scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
63         if (c1>c2) swap(r1,r2),swap(c1,c2);
64         if (s[0]=='O'){
65             if (r1==r2) mdfr(1,1,n,c1,r1,1); else mdfc(1,1,n,c1,1);
66         }
67         if (s[0]=='C'){
68             if (r1==r2) mdfr(1,1,n,c1,r1,0); else mdfc(1,1,n,c1,0);
69         }
70         if (s[0]=='A'){
71             P L=que(1,1,n,1,c1),M=que(1,1,n,c1,c2),R=que(1,1,n,c2,n);
72             if (r1==1 && r2==1) puts((M.u | (L.r & M.p) | (M.q & R.l) | (L.r & M.d & R.l))?"Y":"N");
73             if (r1==2 && r2==2) puts((M.d | (L.r & M.q) | (M.p & R.l) | (L.r & M.u & R.l))?"Y":"N");
74             if (r1==1 && r2==2) puts((M.q | (L.r & M.d) | (M.u & R.l) | (L.r & M.p & R.l))?"Y":"N");
75             if (r1==2 && r2==1) puts((M.p | (L.r & M.u) | (M.d & R.l) | (L.r & M.q & R.l))?"Y":"N");
76         }
77     }
78     return 0;
79 }

 

posted @ 2018-11-07 21:56  HocRiser  阅读(223)  评论(0编辑  收藏  举报