我的这份屎山代码里并没有 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;
}