求助
查看原帖
求助
350558
_wsq_楼主2025/7/3 16:14

我的这份屎山代码里并没有 abort 或者 assert,却 RE 提示 Received signal 6。

#include<iostream>
#include<set>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 200005
#define int long long
#define inf 0x3f3f3f3f
struct node2{
	int x1,x2,y1_,y2;
	node2(int _x1,int _x2,int _y1,int _y2){
		x1=_x1;
		x2=_x2;
		y1_=_y1;
		y2=_y2;
	}
	bool operator<(const node2 rhs)const{
		return y1_<rhs.y1_;
	}
};
struct node1{
	int x1,x2,y1_,y2;
	node1(int _x1,int _x2,int _y1,int _y2){
		x1=_x1;
		x2=_x2;
		y1_=_y1;
		y2=_y2;
	}
	node1(node2 n1){
		x1=n1.x1;
		x2=n1.x2;
		y1_=n1.y1_;
		y2=n1.y2;
	}
	bool operator<(const node1 rhs)const{
		return x1<rhs.x1;
	}
};
bool operator<=(const node1 lhs,const node2 rhs){
	return lhs.x1<=rhs.x1;
}
bool operator<=(const node2 lhs,const node1 rhs){
	return lhs.x1<=rhs.x1;
}
bool operator>=(const node1 lhs,const node2 rhs){
	return lhs.x1>=rhs.x1;
}
bool operator>=(const node2 lhs,const node1 rhs){
	return lhs.x1>=rhs.x1;
}
bool operator==(const node1 lhs,const node2 rhs){
	return lhs.x1==rhs.x1;
}
bool operator==(const node2 lhs,const node1 rhs){
	return lhs.x1==rhs.x1;
}
int n,t,xx,yy,ans;
set<node1> s1;
set<node2> s2;
multiset<int> a;
int dis(int x,int y){
	return sqrt(x*x+y*y);
}
void era(node1 it1,node1 it2){
	if(it1.x2<=xx&&it2.x1>=xx){
		if(it1.y2<=yy&&it2.y1_>=yy){
			a.erase(a.find(dis(xx,yy)));
		}
		else{
			a.erase(a.find(dis(xx,it1.y2)+abs(it1.y2-yy)));
			a.erase(a.find(dis(xx,it2.y1_)+abs(it2.y1_-yy)));
		}
	}
	else{
		if(it1.y2<=yy&&it2.y1_>=yy){
			a.erase(a.find(dis(yy,it1.x2)+abs(it1.x2-xx)));
			a.erase(a.find(dis(yy,it2.x1)+abs(it2.x1-yy)));
		}
		else{
			a.erase(a.find(abs(xx-it1.x2)+dis(it1.x2,it1.y2)+abs(it1.y2-yy)));
			a.erase(a.find(abs(xx-it1.x2)+dis(it1.x2,it2.y1_)+abs(it2.y1_-yy)));
			a.erase(a.find(abs(xx-it2.x2)+dis(it2.x2,it1.y2)+abs(it1.y2-yy)));
			a.erase(a.find(abs(xx-it2.x2)+dis(it2.x2,it2.y1_)+abs(it2.y1_-yy)));
		}
	}
	return;
}
void ins(node1 it1,node1 it2){
	if(it1.x2<=xx&&it2.x1>=xx){
		if(it1.y2<=yy&&it2.y1_>=yy){
			a.insert(dis(xx,yy));
		}
		else{
			a.insert(dis(xx,it1.y2)+abs(it1.y2-yy));
			a.insert(dis(xx,it2.y1_)+abs(it2.y1_-yy));
		}
	}
	else{
		if(it1.y2<=yy&&it2.y1_>=yy){
			a.insert(dis(yy,it1.x2)+abs(it1.x2-xx));
			a.insert(dis(yy,it2.x1)+abs(it2.x1-yy));
		}
		else{
			a.insert(abs(xx-it1.x2)+dis(it1.x2,it1.y2)+abs(it1.y2-yy));
			a.insert(abs(xx-it1.x2)+dis(it1.x2,it2.y1_)+abs(it2.y1_-yy));
			a.insert(abs(xx-it2.x2)+dis(it2.x2,it1.y2)+abs(it1.y2-yy));
			a.insert(abs(xx-it2.x2)+dis(it2.x2,it2.y1_)+abs(it2.y1_-yy));
		}
	}
	return;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	s1.insert(node1(0,0,0,0));
	s1.insert(node1(inf,inf,inf,inf));
	s2.insert(node2(0,0,0,0));
	s2.insert(node2(inf,inf,inf,inf));
	cin>>n>>t>>xx>>yy;
	ans=dis(xx,yy);
	a.insert(ans);
	int last=0;
	for(int i=1;i<=n;i++){
		int s,x,y;
		cin>>s>>x>>y;
		for(;last<s;last++){
			cout<<ans<<'\n';
		}
		set<node1>::iterator it1=--s1.upper_bound(node1(x,11,45,14)),it2;
		it2=it1;
		if(it1->x2<x){
			it2++;
		}
		set<node2>::iterator it3=--s2.upper_bound(node2(11,45,y,14)),it4;
		it4=it3;
		if(it3->y2<y){
			it4++;
		}
		if(*(it1)==*(it3)&&*(it2)==*(it4)){
			if(it1!=it2){
				era(*it1,*it2);
				s1.insert(node1(x,x,y,y));
				s2.insert(node2(x,x,y,y));
				ins(*it1,node1(x,x,y,y));
				ins(node1(x,x,y,y),*it2);
			}
		}
		else{
			if(*(it2)<=*(it3)){
				set<node1>::iterator cnt=it2,tmp;
				while(*(cnt)<=*(it3)){
					tmp=--cnt;
					era(*tmp,*cnt);
					s1.erase(cnt);
					s2.erase(node2(cnt->x1,cnt->x2,cnt->y1_,cnt->y2));
					cnt=s1.upper_bound(node1(x,11,45,14));
				}
				tmp=--cnt;
				era(*tmp,*cnt);
				s1.insert(node1(min(x,it2->x1),it3->x2,it2->y1_,max(y,it3->y2)));
				s2.insert(node2(min(x,it2->x1),it3->x2,it2->y1_,max(y,it3->y2)));
				cnt=s1.find(node1(min(x,it2->x1),it3->x2,it2->y1_,max(y,it3->y2)));
				tmp=cnt--;
				ins(*tmp,*cnt);
				tmp++;
				tmp++;
				ins(*cnt,*tmp);
			}
			else{
				if(*(it1)>=*(it4)){
					set<node2>::iterator cnt=it4,tmp;
					while(*(cnt)<=*(it1)){
						tmp=--cnt;
						era(*tmp,*cnt);
						s1.erase(node1(cnt->x1,cnt->x2,cnt->y1_,cnt->y2));
						s2.erase(cnt);
						cnt=s2.upper_bound(node2(11,45,x,14));
					}
					tmp=--cnt;
					era(*tmp,*cnt);
					s1.insert(node1(it4->x1,max(x,it1->x2),max(y,it4->y1_),it1->y2));
					s2.insert(node2(it4->x1,max(x,it1->x2),max(y,it4->y1_),it1->y2));
					tmp=cnt--;
					ins(*tmp,*cnt);
					tmp++;
					tmp++;
					ins(*cnt,*tmp);
				}
				else{
					return 114514;
				}
			}
		}
		ans=*(a.begin());
	}
	for(;last<t;last++){
		cout<<ans<<'\n';
	}
	return 0;
}
2025/7/3 16:14
加载中...