[HNOI2002]营业额统计

https://daniu.luogu.org/problemnew/show/P2234

#include <bits/stdc++.h>

const int N = 1e5 + 10;

#define gc getchar()
#define inf 0x3f3f3f3f

int fa[N], ch[N][2], cnt[N], siz[N], data[N];
int n, Ti, root, answer;

inline int read(){
    int x = 0, f = 1; char c = gc;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = gc;} 
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;
    return x * f;
}

int son(int x){
    return x == ch[fa[x]][1];
}

void rotate(int x){
    int y = fa[x], z = fa[y], b = son(x), c = son(y), a = ch[x][!b];
    if(z) ch[z][c] = x; else root = x; fa[x] = z;
    if(a) fa[a] = y; ch[y][b] = a;
    ch[x][!b] = y; fa[y] = x;
}

void splay(int x, int i){
    while(fa[x] != i){
        int y = fa[x], z = fa[y];
        if(z == i) rotate(x);
        else if(son(x) == son(y)) rotate(y), rotate(x);
        else rotate(x), rotate(x);
    }
}

void ins(int rt, int v){
    int y, x = rt;
    while(1){
        y = ch[x][data[x] < v];
        if(!y){
            y = ++ n;
            root = n;
            data[y] = v;
            fa[y] = x;
            ch[x][data[x] < v] = y;
            break;
        }
        x = y;
    }
    splay(y, 0);
}

int getpre(int rt){
    int p = ch[rt][0];
    while(ch[p][1]) p = ch[p][1];
    return p;
}

int getsuc(int rt){
    int p = ch[rt][1];
    while(ch[p][0]) p = ch[p][0];
    return p;
} 

int main()
{
    Ti = read();
    ins(root, inf);
    ins(root, - inf);
    for(int i = 1; i <= Ti; i ++){
        int x = read();
        if(i == 1){
            answer += x;
            ins(root, x);
        }
        else {
            ins(root, x);
            int pre = getpre(root);
            int suc = getsuc(root);
            answer += std :: min(abs(x - data[pre]), abs(x - data[suc]));
        }
    }
    std :: cout << answer;
    return 0;
}

 

posted @ 2017-12-12 17:25  xayata  阅读(137)  评论(0编辑  收藏  举报