用平衡树按照题意模拟即可。
但是写一个平衡树很麻烦,我们可以用 set
代替。
set
的 upper_bound
函数可以返回一个不比 x
小的最小数的迭代器,将其减一就是比它小的最大数。插入删除也很方便。
#include<bits/stdc++.h>
using namespace std;
int getint(){
int ans=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
ans=ans*10+c-'0';
c=getchar();
}
return ans*f;
}
set<long long>a,b;
int main(){
int n=getint();
long long ans=0;
a.insert(-0x7ffffffffll),a.insert(0x7ffffffffll);
b.insert(-0x7ffffffffll),b.insert(0x7ffffffffll);
while(n--){
int x=getint(),y=getint();
if(x){
if(a.size()>2){
long long p=*--a.lower_bound(y),q=*a.lower_bound(y);
//cout<<"! "<<y<<" "<<p<<" "<<q<<endl;
if(y-p<=q-y)ans+=y-p,a.erase(p);
else ans+=q-y,a.erase(q),ans%=1000000;
}else b.insert(y);
}else{
if(b.size()>2){
long long p=*--b.lower_bound(y),q=*b.lower_bound(y);
//cout<<"? "<<y<<" "<<p<<" "<<q<<endl;
if(y-p<=q-y)ans+=y-p,b.erase(p);
else ans+=q-y,b.erase(q),ans%=1000000;
}else a.insert(y);
}
}
cout<<ans%1000000;
return 0;
}