萌新求助set的insert操作不明原因RE
  • 板块学术版
  • 楼主ElzaYork
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/7/14 18:46
  • 上次更新2023/10/27 20:20:59
查看原帖
萌新求助set的insert操作不明原因RE
359283
ElzaYork楼主2022/7/14 18:46

RT。站外题。

struct Park{
	int x,y,z,pos;
	bool operator < (const Park &a)const{
		return (z==a.z) ? (x<a.x) : (z>a.z);
	}
}tmp;
set<Park>s1;
//			printf("x:%d y:%d z:%d pos:%d\n",tmp.x,tmp.y,tmp.z,tmp.pos);
			s1.insert(tmp);
//			puts("Inserted");

在上面的这段代码中,前面的输出都正常, 但是在一个 insert 操作之后没有输出 Inserted ,RE了。

感觉很奇怪 QwQ 求大佬解惑 orz

附上完整代码和RE的样例:



#include<bits/stdc++.h>
//#define int ll
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define piii pair<int,pair<int,int> >
#define fir first
#define sec second
#define IT1 set<Park>::iterator
#define IT2 set<int>::iterator
typedef long long ll;
using namespace std;
const int N=1000005;
const int inf=(1<<30)-1;
const ll inff=(1ll<<60)-1;
const int mod=998244353;
inline int read(){
	int x=0,f=1; char c=getchar();
	while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar();}
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x*f;
}
int n,m,ys[N];
struct Park{
	int x,y,z,pos;
	bool operator < (const Park &a)const{
		return (z==a.z) ? (x<a.x) : (z>a.z);
	}
}tmp;
set<Park>s1;
set<int>s2;
int main(){
//  freopen("D.in","r",stdin);
    n=read(),m=read();
    tmp.x=1,tmp.y=n,tmp.z=n-1,tmp.pos=1;
    s1.insert(tmp);
    while(m--){
    	int opt=read(),v=read();
    	if(opt==1){
    		IT1 it = s1.begin();
    		int x = it->x , y = it->y , pos = it->pos;
//    		printf("x:%d y:%d pos:%d z:%d\n",x,y,pos,it->z);
    		s2.insert(pos);
    		ys[v] = pos;
    		printf("%d\n",pos);
    		s1.erase(it);
    		if(x<pos){
    			tmp.x = x , tmp.y = pos-1 , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
				tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
				s1.insert(tmp);
			}
    		if(pos<y){
    			tmp.x = pos+1 , tmp.y = y , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
				tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
				s1.insert(tmp);
			}
		}
		else{
			int le,ri;
			v = ys[v];
			IT2 it = s2.lower_bound(v);
			if(it != s2.begin()){
				it--;
				le = (*it)+1;
				tmp.x = le , tmp.y = v-1 , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
				tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
				s1.erase(s1.lower_bound(tmp));
				it++;
			}
			else le = v;
			it++;
			if(it != s2.end()){
				ri = (*it)-1;
				tmp.x = v+1 , tmp.y = ri , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
				tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
				s1.erase(s1.lower_bound(tmp));
			}
			else ri = v;
			tmp.x = le , tmp.y = ri , tmp.z = (tmp.x==1 ? tmp.y-1 : (tmp.y==n ? n-tmp.x : (tmp.y-tmp.x>>1)) );
			tmp.pos = (tmp.x==1 ? 1 : (tmp.y==n ? n : (tmp.x+tmp.y>>1) ) );
//			printf("x:%d y:%d z:%d pos:%d\n",tmp.x,tmp.y,tmp.z,tmp.pos);
			s1.insert(tmp);
//			puts("Inserted");
		}
	}
	return 0;
}

Input:
7 11 
1 15 
1 123123 
1 3 
1 5 
2 123123 
2 15 
1 21 
2 3 
1 6 
1 7 
1 8
Output:
1 
7 
4 
2 
7 
4 
1 
3
2022/7/14 18:46
加载中...