[BZOJ1018][SHOI2008]堵塞的交通traffic(线段树)
2018-11-07 21:56
639 查看
显然离线可以分治并查集,在线可以LCT,单都没用到只有两行的性质。
线段树,每个点记录一个矩形的四个角的连通情况,合并时讨论各种情况即可。
参考:https://www.geek-share.com/detail/2687777720.html
#include<cstdio> #include<algorithm> #define ls (x<<1) #define rs (ls|1) #define lson ls,L,mid #define rson rs,mid+1,R #define rep(i,l,r) for (int i=(l); i<=(r); i++); using namespace std; const int N=100010; char s[10]; int n,r1,r2,c1,c2; struct P{ bool U,D,l,r,u,d,q,p; }p[N<<2]; void merge(P &x,P L,P R){ x.u=(L.u & x.U & R.u) | (L.q & x.D & R.p); x.d=(L.d & x.D & R.d) | (L.p & x.U & R.q); x.q=(L.u & x.U & R.q) | (L.q & x.D & R.d); x.p=(L.p & x.U & R.u) | (L.d & x.D & R.p); x.l=L.l | (L.u & x.U & R.l & x.D & L.d); x.r=R.r | (R.u & x.U & L.r & x.D & R.d); } void build(int x,int L,int R){ if (L==R){ p[x]=(P){1,1,0,0,1,1,0,0}; return; } int mid=(L+R)>>1; build(lson); build(rson); } void mdfr(int x,int L,int R,int pos,int k,bool op){ int mid=(L+R)>>1; if (mid==pos){ if (k==1) p[x].U=op; else p[x].D=op; merge(p[x],p[ls],p[rs]); return; } if (pos<=mid) mdfr(lson,pos,k,op); else mdfr(rson,pos,k,op); merge(p[x],p[ls],p[rs]); } void mdfc(int x,int L,int R,int pos,bool op){ if (L==R){ p[x].l=p[x].r=p[x].p=p[x].q=op; return; } int mid=(L+R)>>1; if (pos<=mid) mdfc(lson,pos,op); else mdfc(rson,pos,op); merge(p[x],p[ls],p[rs]); } P que(int x,int L,int R,int l,int r){ if (L==l && r==R) return p[x]; int mid=(L+R)>>1; if (r<=mid) return que(lson,l,r); else if (l>mid) return que(rson,l,r); else{ P res=p[x]; merge(res,que(lson,l,mid),que(rson,mid+1,r)); return res; } } int main(){ freopen("bzoj1018.in","r",stdin); freopen("bzoj1018.out","w",stdout); scanf("%d",&n); build(1,1,n); while (1){ scanf("%s",s); if (s[0]=='E') break; scanf("%d%d%d%d",&r1,&c1,&r2,&c2); if (c1>c2) swap(r1,r2),swap(c1,c2); if (s[0]=='O'){ if (r1==r2) mdfr(1,1,n,c1,r1,1); else mdfc(1,1,n,c1,1); } if (s[0]=='C'){ if (r1==r2) mdfr(1,1,n,c1,r1,0); else mdfc(1,1,n,c1,0); } if (s[0]=='A'){ P L=que(1,1,n,1,c1),M=que(1,1,n,c1,c2),R=que(1,1,n,c2,n); if (r1==1 && r2==1) puts((M.u | (L.r & M.p) | (M.q & R.l) | (L.r & M.d & R.l))?"Y":"N"); if (r1==2 && r2==2) puts((M.d | (L.r & M.q) | (M.p & R.l) | (L.r & M.u & R.l))?"Y":"N"); if (r1==1 && r2==2) puts((M.q | (L.r & M.d) | (M.u & R.l) | (L.r & M.p & R.l))?"Y":"N"); if (r1==2 && r2==1) puts((M.p | (L.r & M.u) | (M.d & R.l) | (L.r & M.q & R.l))?"Y":"N"); } } return 0; }
相关文章推荐
- 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic
- [BZOJ1018][SHOI2008]堵塞的交通traffic(线段树维护连通性)
- [bzoj1018][SHOI2008]堵塞的交通traffic【线段树】
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
- [BZOJ1018][SHOI2008]堵塞的交通traffic(线段树)
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)
- 【BZOJ1018】【SHOI2008】堵塞的交通traffic(线段树)(好题)
- bzoj1018: [SHOI2008]堵塞的交通traffic 线段树区间合并
- BZOJ_1018_[SHOI2008]_交通堵塞traffic_(线段树)
- BZOJ[1018][SHOI2008]堵塞的交通traffic 线段树
- 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树维护连通性
- 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic
- 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
- bzoj 1018: [SHOI2008]堵塞的交通traffic (线段树维护连通性)
- BZOJ 1018 SHOI2008 堵塞的交通traffic 线段树
- [bzoj1018][SHOI2008]堵塞的交通traffic——线段树
- bzoj1018 [SHOI2008]堵塞的交通traffic
- [BZOJ1018]SHOI2008堵塞的交通|线段树