求助:线段树莫名re
查看原帖
求助:线段树莫名re
1062499
粥2414楼主2025/1/17 10:56

只过了#4#5#6 30分,其他全re,显示

Runtime Error.
Received signal 11: Segmentation fault with invalid memory reference.
#include<bits/stdc++.h>
#define ll long long
#define dd long double
#define lson (id*2)
#define rson (id*2+1)
#define mid ((l+r)/2)
using namespace std;
inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
}
const ll N=1e6+9;
ll c;
struct TREE{
	bool l,r,u,d,p,q;
	ll y;//右
}tr[N*4];
bool con[N*4][10];
void pu(TREE &x,TREE l,TREE r){
	x.l=l.l||(l.u&&con[l.y][1]&&r.l&&con[l.y][2]&&l.d);
	x.r=r.r||(r.u&&con[l.y][1]&&l.r&&con[l.y][2]&&r.d);
	x.u=(l.u&&con[l.y][1]&&r.u)||(l.p&&con[l.y][2]&&r.q);
	x.d=(l.d&&con[l.y][2]&&r.d)||(l.q&&con[l.y][1]&&r.p);
	x.p=(l.u&&con[l.y][1]&&r.p)||(l.p&&con[l.y][2]&&r.d);
	x.q=(r.u&&con[l.y][1]&&l.q)||(r.q&&con[l.y][2]&&l.d);
}
void build(ll id,ll l,ll r){
	tr[id].y=r;
	if(l==r){
		tr[id].u=1;
		tr[id].d=1;
		return;
	}
	build(lson,l,mid);
	build(rson,mid+1,r);
}
void change(ll id,ll l,ll r,ll x,ll v){//同列修改 
	if(l==r){
		tr[id].l=tr[id].r=tr[id].p=tr[id].q=v;
		return;
	}
	if(x<=mid){
		change(lson,l,mid,x,v);
	}
	else{
		change(rson,mid+1,r,x,v);
	}
	pu(tr[id],tr[lson],tr[rson]);
	return;
}
void fix(ll id,ll l,ll r,ll x,ll v,ll vel){//同行修改 
	if(mid==x){
		con[x][v]=vel;
		if(l!=r){
			pu(tr[id],tr[lson],tr[rson]);
		}
		return;
	}
	if(x<=mid){
		fix(lson,l,mid,x,v,vel);
	}
	else{
		fix(rson,mid+1,r,x,v,vel);
	}
	pu(tr[id],tr[lson],tr[rson]);
	return;
}
TREE qu(ll id,ll l,ll r,ll ql,ll qr){
	if(ql<=l&&r<=qr){
		return tr[id];
	}
	if(ql>mid){
		return qu(rson,mid+1,r,ql,qr);
	}
	if(qr<=mid){
		return qu(lson,l,mid,ql,qr);
	}
	TREE ans;
	pu(ans,qu(lson,l,mid,ql,qr),qu(rson,mid+1,r,ql,qr));
	return ans;
}
int main(){
	c=read();
	build(1,1,c);
	while(1){
		string op;
		cin>>op;
		if(op=="Exit"){
			break;
		}
		if(op=="Close"){
			ll r1=read(),c1=read(),r2=read(),c2=read();
			if(r1!=r2){
				change(1,1,c,c1,0);
			}
			else{
				fix(1,1,c,min(c1,c2),r1,0);
			}
		} 
		if(op=="Open"){
			ll r1=read(),c1=read(),r2=read(),c2=read();
			if(r1!=r2){
				change(1,1,c,c1,1);
			}
			else{
				fix(1,1,c,min(c1,c2),r1,1);
			}
		}
		bool flag=0;
		if(op=="Ask"){
			ll r1=read(),c1=read(),r2=read(),c2=read();
			if(c1>c2){
				swap(c1,c2);swap(r1,r2);
			}
			TREE l=qu(1,1,c,1,c1);
			TREE now=qu(1,1,c,c1,c2);
			TREE r=qu(1,1,c,c2,c);
			if(r1==r2&&r1==1){
				if(now.u )flag=1;
				if(l.r &&now.d &&r.l )flag=1;
			}
			if(r1==r2&&r1==2){
				if(now.d )flag=1;
				if(l.r &&now.u &&r.l )flag=1;
			}
			if(r1!=r2&&r1==1){
				if(now.p )flag=1;
				if(l.r &&now.d )flag=1;
				if(now.u &&r.l )flag=1;
			}
			if(r1!=r2&&r1==2){
				if(now.q )flag=1;
				if(l.r &&now.u )flag=1;
				if(r.l &&now.d )flag=1;
			}
			puts(flag?"Y":"N");
		}
		
	}
//	cout<<con[1][1]<<endl;
//	ll i=3;
//	cout<<tr[i].u<<' '<<tr[i].d<<' '<<tr[i].l <<' '<<tr[i].r<<' '<<tr[i].p<<' '<<tr[i].q;
	return 0;
}
2025/1/17 10:56
加载中...