#include<bits/stdc++.h>
#define N 100005
using namespace std;
bool edge[N][2];
struct state{
bool b[2][2],lb,rb;
int l,r;
state(int _=0,int __=0){
l=_;r=__;
memset(b,false,sizeof b);
lb=rb=false;
}
state operator+(const state&k)const{
state re=state(l,k.r);
re.lb=lb|(edge[r][0]&edge[r][1]&b[0][0]&b[1][1]&k.lb);
re.rb=k.rb|(edge[r][0]&edge[r][1]&k.b[0][0]&k.b[1][1]&rb);
for(int i=0;i<=1;++i)
for(int j=0;j<=1;++j)
for(int h=0;h<=1;++h)
re.b[i][j]|=b[i][h]&edge[r][h]&k.b[h][j];
return re;
}
};
struct Node{
Node *ch[2];
int l,r;
state a;
inline void maintain(){
if(l==r) return;
a=ch[0]->a+ch[1]->a;
}
}*root;
void buildtree(Node *&o,int l,int r){
o=new Node;
o->l=l;o->r=r;
o->a=state(l,r);
if(l==r){
o->a.b[0][0]=o->a.b[1][1]=true;
return;
}
int mid=l+r>>1;
buildtree(o->ch[0],l,mid);
buildtree(o->ch[1],mid+1,r);
o->maintain();
}
void Modify(Node *&o,int x,int v){
if(o->l==o->r){o->a.b[0][1]=o->a.b[1][0]=o->a.lb=o->a.rb=v;return;}
int mid=o->l+o->r>>1;
if(x<=mid) Modify(o->ch[0],x,v);
else Modify(o->ch[1],x,v);
o->maintain();
}
void Update(Node *o,int x){
if(o->l==o->r) return;
int mid=o->l+o->r>>1;
if(x<=mid) Update(o->ch[0],x);
else Update(o->ch[1],x);
o->maintain();
}
state Query(Node *o,int l,int r){
if(o->l==l && o->r==r) return o->a;
int mid=o->l+o->r>>1;
if(r<=mid) return Query(o->ch[0],l,r);
else if(l>mid) return Query(o->ch[1],l,r);
else return Query(o->ch[0],l,mid)+Query(o->ch[1],mid+1,r);
}
int main(){
int n;
scanf("%d",&n);
buildtree(root,1,n);
while(1){
char opt[10];
scanf("%s",opt);
if(opt[0]=='O'){
int x1,yl,x2,y2;
scanf("%d%d%d%d",&x1,&yl,&x2,&y2);--x1;--x2;
if(yl==y2) Modify(root,yl,true);
else{
if(yl>y2) swap(x1,x2),swap(yl,y2);
edge[yl][x1]=true;
Update(root,yl);Update(root,y2);
}
}
else if(opt[0]=='C'){
int x1,yl,x2,y2;
scanf("%d%d%d%d",&x1,&yl,&x2,&y2);--x1;--x2;
if(yl==y2) Modify(root,yl,false);
else{
if(yl>y2) swap(x1,x2),swap(yl,y2);
edge[yl][x1]=false;
Update(root,yl);Update(root,y2);
}
}
else if(opt[0]=='A'){
int x1,yl,x2,y2;
scanf("%d%d%d%d",&x1,&yl,&x2,&y2);--x1;--x2;
if(yl>y2) swap(x1,x2),swap(yl,y2);
state l=Query(root,1,yl),k=Query(root,yl,y2),r=Query(root,y2,n);
int ans=k.b[x1][x2]|(l.rb&k.b[x1^1][x2])|(r.lb&k.b[x1][x2^1])|(l.rb&r.lb&k.b[x1^1][x2^1]);
puts(ans?"Y":"N");
}
else break;
}
return 0;
}
【bzoj 1018】堵塞的交通traffic(线段树)
最新推荐文章于 2019-09-02 12:58:00 发布