用Splaytree实现基本的插入,求前驱,求后继操作。
数据有问题。。。有些数据输入n后,后面没有n个数,后面没有的数全都当成0才可以过。
#include
#include
using namespace std;
typedef long long ll;
#define lson x->ch[0]
#define rson x->ch[1]
#define ket (root->ch[1]->ch[0])
const int maxn = 33333;
const int INF = 1LL<<31-1;
struct NODE {
NODE *pre, *ch[2];
int val, sz, id;
void up() {
sz = ch[0]->sz + ch[1]->sz + 1;
}
}node[maxn], *null = &node[0], *root;
struct Splaytree {
int top;
void Rotate(NODE *x, int c) {
NODE *y = x->pre;
y->ch[!c] = x->ch[c];
x->ch[c]->pre = y;
x->pre = y->pre;
if(y->pre != null) y->pre->ch[ y->pre->ch[1] == y] = x;
x->ch[c] = y; y->pre = x;
y->up();
}
void Splay(NODE *x, NODE *go) {
while(x->pre != go) {
if(x->pre->pre == go) Rotate(x, x->pre->ch[0] == x);
else {
NODE *y = x->pre, *z = y->pre;
int f = z->ch[1] == y;
if(y->ch[f] == x) Rotate(y, !f);
else Rotate(x, f);
Rotate(x, !f);
}
}
x->up();
if(go == null) root = x;
}
void RTO(int k, NODE *go) {
NODE *x = root;
while(lson->sz != k) {
if(lson->sz > k) x = lson;
else {
k -= lson->sz + 1;
x = rson;
}
}
Splay(x, go);
}
NODE *newnode(int c, NODE *f=null) {
NODE *x = &node[++top];
lson = rson = null;
x->id = top; x->pre = f;
x->val = c; x->sz = 1;
return x;
}
NODE* Insert(int c) {
if(root == null) return root = newnode(c);
NODE *x = root;
while(x->ch[ x->val < c] != null) {
if(x->val == c) {
Splay(x, null);
return null;
}
x = x->ch[ x->val < c];
}
if(x->val == c) {
Splay(x, null);
return null;
}
x->ch[ x->val < c] = newnode(c, x);
Splay(x->ch[x->val
ch[0] == null) return -1;
x = x->ch[0];
while(x->ch[1] != null) x = x->ch[1];
return x->val;
}
int find_nxt(NODE *x) {
if(x->ch[1] == null) return -1;
x = x->ch[1];
while(x->ch[0] != null) x = x->ch[0];
return x->val;
}
void init() {
null->sz = null->val = null->id = 0;
top = 0; root = null;
}
void solve() {
int n, v;
scanf("%d%d", &n, &v);
init();
Insert(v);
int ans = v;
for(int i = 0;i < n-1; i++) {
if(scanf("%d", &v) == -1) v = 0;
if(Insert(v) == null) continue;
int add = INF;
int cur = find_pre(root);
if(cur != -1) add = min(add, v-cur);
cur = find_nxt(root);
if(cur != -1) add = min(add, cur-v);
ans += add;
}
printf("%d\n", ans);
}
}spt;
int main() {
spt.solve();
return 0;
}