Treap 求调
查看原帖
Treap 求调
547908
NightTide楼主2022/5/10 16:09

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
*/
2022/5/10 16:09
加载中...