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;
}
谢谢啦~