[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 }