RT,40pts WA,只对 #6 #7 #8 #9 四个点,求大佬帮忙调一下
#include<bits/stdc++.h>
#define MAXN 80010
#define INF 0x3f3f3f3f
#define MOD 1000000
#define ls tree[now].lson
#define rs tree[now].rson
using namespace std;
struct node{
int lson,rson;
int val,key;
int size,cnt;
};
bool flag = false;
int n,tot,cnt[2],root,ans;
node tree[MAXN];
void push_up(int now){
tree[now].size = tree[ls].size + tree[rs].size + tree[now].cnt;
}
void add_point(int &now,int val){
now = ++tot;
tree[now].val = val;
tree[now].key = rand();
}
void turn_l(int &now){
int tmp = tree[now].rson;
tree[now].rson = tree[tmp].lson;
tree[tmp].lson = now;
now = tmp;
push_up(tree[now].lson);
push_up(now);
}
void turn_r(int &now){
int tmp = tree[now].lson;
tree[now].lson = tree[tmp].rson;
tree[tmp].rson = now;
now = tmp;
push_up(tree[now].rson);
push_up(now);
}
void insert(int &now,int val){
if(now == 0){
add_point(now,val);
return ;
}
if(val == tree[now].val) tree[now].cnt++;
else if(val < tree[now].val){
insert(ls,val);
if(tree[ls].key < tree[now].key) turn_r(now);
}else if(val > tree[now].val){
insert(rs,val);
if(tree[rs].key < tree[now].key) turn_l(now);
}
push_up(now);
}
void remove(int &now,int val){
if(now == 0) return ;
if(val == tree[now].val){
if(tree[now].cnt > 1) tree[now].cnt--;
else if(tree[now].lson == 0 && tree[now].rson == 0) now = 0;
else if(tree[now].lson == 0 || tree[ls].key > tree[rs].key){
turn_l(now);
remove(tree[now].lson,val);
}else if(tree[now].rson == 0 || tree[rs].key > tree[ls].key){
turn_r(now);
remove(tree[now].rson,val);
}
push_up(now);
return ;
}
if(val < tree[now].val) remove(ls,val);
else if(val > tree[now].val) remove(rs,val);
push_up(now);
}
int get_pre(int now,int val){
int pre = -INF;
while(now){
if(tree[now].val <= val){
pre = tree[now].val;
now = tree[now].rson;
}else{
now = tree[now].lson;
}
}
return pre;
}
int get_nxt(int now,int val){
int nxt = INF;
while(now){
if(tree[now].val >= val){
nxt = tree[now].val;
now = tree[now].lson;
}else{
now = tree[now].rson;
}
}
return nxt;
}
int main(){
scanf("%d",&n);
insert(root,-INF); insert(root,INF);
// printf("%d %d\n",flag,cnt);
for(int i = 1;i <= n;i++){
int op,x;
scanf("%d%d",&op,&x);
if(cnt[!op] != 0){
int pre = get_pre(root,x), nxt = get_nxt(root,x);
if(abs(x - pre) <= abs(x - nxt)){
// printf("pre | ");
ans += abs(x - pre);
remove(root,pre);
}else{
// printf("nxt | ");
ans += abs(x - nxt);
remove(root,nxt);
}
ans %= MOD;
cnt[!op]--;
}else{
cnt[op]++;
insert(root,x);
}
}
printf("%d\n",ans);
return 0;
}
/*
5
0 2
0 4
1 3
1 2
1 5
*/