set 有啥 UB 啊?
查看原帖
set 有啥 UB 啊?
150064
Gokix楼主2021/11/3 16:49

http://codeforces.com/contest/1398/submission/134194755

上来就 RE 了,感觉很离谱的是我们学长在本地造了几组数据给我们测。我在一个点上 RE 了,但是直接将断点加在 return 0; 后调试,它就正常输出了并且没有 RE。

所以我怀疑是 set 的问题。由于我老c党今天刚学 set,所以是不是犯了什么奇怪的 UB。

反正只用找 UB 所以也不用解释自己的垃圾代码的思路吧啊吧~

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;

inline long long read(){char ch=getchar();long long x=0,f=1;while(ch<'0' || ch>'9'){if(ch=='-') f=-1;ch=getchar();}
                        while('0'<=ch && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
const long long N=2e5+1;
long long t,cnt,sum,ans;
set <long long> at,li,jk;

void recalc(){
	long long att=at.size();
	set <long long>::iterator itat,itjk;
	while(att<cnt && !jk.empty()){
		itjk=jk.end();itjk--;
		ans+=(*itjk);
		at.insert(*itjk),jk.erase(itjk);
		att++;
	}
	while(att>cnt){
		itat=at.begin();
		ans-=(*itat);
		jk.insert(*itat),at.erase(itat);
		att--;
	}
	while(!at.empty() && !jk.empty()){
		itjk=jk.end();itjk--;itat=at.begin();
		if(*itat<*itjk){
			ans+=(*itjk-*itat);
			long long tmp=*itjk;
			jk.erase(itjk);
			jk.insert(*itat);
			at.insert(tmp);
			at.erase(itat);
		}
		else break;
	}
}

int main(){
	long long i,j,u,v,op,val;
	t=read();
	while(t--){
		op=read(),val=read();
		sum+=val;
		if(op==0){
			if(val>0) jk.insert(val);
			else{
				if(jk.find(-val)!=jk.end()) jk.erase(-val);
				else{at.erase(-val);ans+=val;}
			}
		}
		else{
			if(val>0){
				cnt++;
				if(!li.empty()){
					jk.insert(max(val,*li.begin()));
				}
				li.insert(val);
			}
			else{
				cnt--;
				li.erase(-val);
				if(!li.empty()){
					if(-val<*li.begin()){
						if(jk.find(*li.begin())!=jk.end()) jk.erase(*li.begin());
						else{
							ans-=*li.begin();
							at.erase(li.begin());
						}
					}
					else{
						if(jk.find(-val)!=jk.end()) jk.erase(-val);
						else{
							ans-=(-val);
							at.erase(-val);
						}
					}
				}
			}
		}
		recalc();
		printf("%lld\n",ans+sum);
	}
	return 0;
}

谢谢啦~

2021/11/3 16:49
加载中...