1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <iostream> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; inline int randad(){ static int seed=114; return seed=int(seed*48271LL%2147483647); } struct Treap { int key,pri,son[2]; }T[33333]; int cnt=1,rt=0; void rotate(int p,int &rt) { int y=T[rt].son[p]; T[rt].son[p]=T[y].son[!p]; T[y].son[!p]=rt; rt=y; } void ins(int key,int &rt) { if(rt==0) T[rt=cnt++] = (Treap){key,randad()}; else { int p=key>T[rt].key; ins(key,T[rt].son[p]); if(T[T[rt].son[p]].pri>T[rt].pri) rotate(p,rt); } } int nowMin(int key,int rt) { if(rt==0) return 666666666; int res=abs(key-T[rt].key); if(key>T[rt].key) res=min(res,nowMin(key,T[rt].son[1])); else if(key<T[rt].key) res=min(res,nowMin(key,T[rt].son[0])); return res; } int n,tot=0; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { int num; scanf("%d",&num); if (i==1) tot+=num; else tot+=nowMin(num,rt); ins(num,rt); } printf("%d",tot); return 0; }
|