https://www.luogu.com.cn/record/130188965 求求大佬们帮我看眼或者有写好的pb_ds代码发我一份,谢谢qwq
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
const int mod=1e6;
int n;
tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> tr0;
tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> tr2;
int main(){
scanf("%d",&n);
int a,b;
int zeronum=0,onenum=0;
tr2.insert(-99999999); tr0.insert(-99999999);
tr2.insert(99999999); tr0.insert(99999999);
long long ans=0;
for(int i=1;i<=n;++i){
scanf("%d %d",&a,&b);
ans=ans%mod;
if(a==0){
if(onenum==0){
tr0.insert(b);
zeronum++;
}
else{
auto up=*tr2.lower_bound(b);
auto down=*--tr2.lower_bound(b);
if(abs(up-b)==abs(b-down)){
ans+=abs(b-down);
tr2.erase(down);
}
else if(abs(up-b) < abs(b-down)){
ans+=abs(up-b);
tr2.erase(up);
}
else if(abs(up-b) > abs(b-down)){
ans+=abs(b-down);
tr2.erase(down);
}
onenum--;
}
}
else if(a==1){
if(zeronum==0){
tr2.insert(b);
onenum++;
}
else{
auto up=*tr0.lower_bound(b);
auto down=*--tr0.lower_bound(b);
if(abs(up-b)==abs(b-down)){
ans+=abs(b-down);
tr0.erase(down);
}
else if(abs(up-b) < abs(b-down)){
ans+=abs(up-b);
tr0.erase(up);
}
else if(abs(up-b) > abs(b-down)){
ans+=abs(b-down);
tr0.erase(down);
}
zeronum--;
}
}
ans=ans%mod;
}
cout << ans%mod;
}
//自认为浅显易懂的代码