都是同一份代码,结果不同,求指出错误。(但在本地开的c++11O2也没有问题。)
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int c;
bool g[2][N],gg[N];
struct SegmentTree{
struct Node{
int l,r;
int f[2][2];
int fir,lst;bool link;
}tr[N<<2];
void build(int p,int l,int r){
tr[p].l=l,tr[p].r=r;
if(l==r){
tr[p].fir=0x3f3f3f3f;
tr[p].lst=0;
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
pushup(p);
}
void pushup(int p){
memset(tr[p].f,0,sizeof tr[p].f);
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
tr[p].f[i][j]|=tr[p<<1].f[i][k]&tr[p<<1|1].f[k][j];
tr[p].lst=max(tr[p<<1].lst,tr[p<<1|1].lst);
tr[p].fir=min(tr[p<<1].fir,tr[p<<1|1].fir);
tr[p].link=tr[p<<1].link&tr[p<<1|1].link;
}
void change(int p,int x){
if(tr[p].l==tr[p].r){
tr[p].f[0][0]=g[0][tr[p].l],tr[p].f[1][1]=g[1][tr[p].l];
tr[p].f[0][1]=g[0][tr[p].l]&gg[tr[p].l];
tr[p].f[1][0]=g[1][tr[p].l]&gg[tr[p].l];
tr[p].lst=(gg[tr[p].l]?tr[p].l:0);
tr[p].fir=(gg[tr[p].l]?tr[p].l:0x3f3f3f3f);
tr[p].link=g[0][tr[p].l]&g[1][tr[p].l];
return;
}
if(x<=tr[p<<1].r)change(p<<1,x);
else change(p<<1|1,x);
pushup(p);
}
int find_lst(int p,int x){
if(tr[p].r<=x)return tr[p].lst;
if(x>=tr[p<<1|1].l)return max(tr[p<<1].lst,find_lst(p<<1|1,x));
return find_lst(p<<1,x);
}
int find_fir(int p,int x){
if(tr[p].l>=x)return tr[p].fir;
if(x<=tr[p<<1].r)return min(tr[p<<1|1].fir,find_fir(p<<1,x));
return find_fir(p<<1|1,x);
}
bool check_link(int p,int l,int r){
if(l<=tr[p].l&&tr[p].r<=r)return tr[p].link;
bool res=1;
if(l<=tr[p<<1].r)res=check_link(p<<1,l,r);
if(r>=tr[p<<1|1].l)res&=check_link(p<<1|1,l,r);
return res;
}
int tmp[2];
void mul(int p,int*f){
memcpy(tmp,f,sizeof tmp);
memset(f,0,sizeof tmp);
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
f[j]|=tmp[i]&tr[p].f[i][j];
}
void query(int p,int l,int r,int*f){
if(l<=tr[p].l&&tr[p].r<=r){
mul(p,f);
return;
}
if(l<=tr[p<<1].r)query(p<<1,l,r,f);
if(r>=tr[p<<1|1].l)query(p<<1|1,l,r,f);
}
bool check_left(int x){
int lst=find_lst(1,x);
if(lst==0)return 0;
if(lst==x)return 1;
return check_link(1,lst+1,x);
}
bool check_right(int x){
int fir=find_fir(1,x);
if(fir==0x3f3f3f3f)return 0;
if(fir==x)return 1;
return check_link(1,x+1,fir);
}
}seg;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>c;
seg.build(1,1,c);
char op[5];int r1,c1,r2,c2;
while(1){
cin>>op;
if(op[0]!='E')cin>>r1>>c1>>r2>>c2,r1--,r2--;
if(op[0]=='O'||op[0]=='C'){
if(r1==r2){
if(c1>c2)swap(c1,c2);
g[r1][c2]=(op[0]=='O');
}
else{
gg[c2]=(op[0]=='O');
}
seg.change(1,c2);
}
else if(op[0]=='A'){
if(c1>c2)swap(r1,r2),swap(c1,c2);
bool left=seg.check_left(c1),right=seg.check_right(c2);
int f[2];f[r1]=1,f[r1^1]=left;
if(c1<c2)seg.query(1,c1+1,c2,f);
bool ok=f[r2]|(f[r2^1]&right);
cout<<(ok?"Y\n":"N\n");
}
else break;
}
}