您的位置:首页 > 其它

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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: