求助莫名RE与TLE
查看原帖
求助莫名RE与TLE
292064
xkai楼主2022/3/27 22:23

c++14O2

c++98O2

c++11O2

c++98

都是同一份代码,结果不同,求指出错误。(但在本地开的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;
	}
}
2022/3/27 22:23
加载中...