Treap 0pts WA 求助
查看原帖
Treap 0pts WA 求助
671013
KawaragiMomoka楼主2024/9/29 08:10
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
int n;
struct Treap {
    int lson, rson;
    int val, pri;
    int siz;
} tree[maxn];
int idcnt;
int root, num, ans;

inline void addNode(int &u, int val) {
    u = ++idcnt;
    tree[u].siz = 1;
    tree[u].lson = tree[u].rson = 0;
    tree[u].val = val;
    tree[u].pri = rand();
}


inline void update(int u) {
    tree[u].siz = tree[tree[u].lson].siz + 1 + tree[tree[u].rson].siz;
}

void rotate(int &u, int direct) {
    int k;
    if (direct == 1) {
        k = tree[u].rson;
        tree[u].rson = tree[k].lson;
        tree[k].lson = u;
    } else {
        k = tree[u].lson;
        tree[u].lson = tree[k].rson;
        tree[k].rson = u;
    }
    tree[k].siz = tree[u].siz;
    update(u);
    u = k;
}

void insertNode(int &u, int val) {
    if (u == 0) {
        addNode(u, val);
        return;
    }
    tree[u].siz++;
    if (val >= tree[u].val) insertNode(tree[u].rson, val);
    else insertNode(tree[u].lson, val);
    if (tree[u].lson && tree[u].pri > tree[tree[u].lson].pri) rotate(u, 0);
    if (tree[u].rson && tree[u].pri > tree[tree[u].rson].pri) rotate(u, 1);
    update(u);
}

int getPre(int u, int val) {
    if (u == 0) return 0;
    if (tree[u].val >= val) return getPre(tree[u].lson, val);
    int res = getPre(tree[u].rson, val);
    if (res == 0) return tree[u].val;
    return res;
}

int getSuf(int u, int val) {
    if (u == 0) return 0;
    if (tree[u].val <= val) return getSuf(tree[u].rson, val);
    int res = getSuf(tree[u].lson, val);
    if (res == 0) return tree[u].val;
    return res;
}

int main() {
    srand(time(NULL));
    scanf("%d%d", &n, &num);
    insertNode(root, num);
    ans += num;
    n--;
    while (n--) {
        scanf("%d", &num);
        int pre = getPre(root, num);
        int suf = getSuf(root, num);
        ans += min(abs(num - pre), abs(suf - num));
        insertNode(root, num);
    }
    printf("%d", ans);
    return 0;
}
2024/9/29 08:10
加载中...