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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <cstdio> #include <algorithm> #include <cstring> #define MAXN 33000 #define mid (l+r>>1) #define ls root<<1 #define rs root<<1|1 #define INF 1e9 using namespace std;
int n, ans, a[MAXN], b[MAXN], vis[MAXN], maxpos[MAXN*4], minpos[MAXN*4];
void up(int root) { maxpos[root]=max(maxpos[ls], maxpos[rs]); minpos[root]=min(minpos[ls], minpos[rs]); }
void update(int root, int l, int r, int x) { if(l>x || r<x) return ; if(l==r) {maxpos[root]=minpos[root]=l; return;} update(ls, l, mid, x); update(rs, mid+1, r, x); up(root); }
int queryl(int root, int l, int r, int x, int y) { if(l>y || r<x) return 0; if(l>=x && r<=y) return maxpos[root]; return max(queryl(ls, l, mid, x, y), queryl(rs, mid+1, r, x, y)); }
int queryr(int root, int l, int r, int x, int y) { if(l>y || r<x) return n+1; if(l>=x && r<=y) return minpos[root]; return min(queryr(ls, l, mid, x, y), queryr(rs, mid+1, r, x, y)); }
int main() { scanf("%d", &n); for(int i=1; i<=n; i++) { scanf("%d", &a[i]); b[i]=a[i]; } b[0]=-INF; b[n+1]=INF; for(int i=0; i<MAXN*4; i++) minpos[i]=n+1;
sort(b+1, b+n+1); unique(b+1, b+n+1); for(int i=1; i<=n; i++) { int pos=lower_bound(b+1, b+n+1, a[i])-b; if(vis[pos]) continue; vis[pos]=1; update(1, 1, n, pos);
if(i==1) ans+=a[i]; else { int x=queryl(1, 1, n, 1, pos-1); int y=queryr(1, 1, n, pos+1, n); ans+=min(a[i]-b[x], b[y]-a[i]); } } printf("%d\n", ans); }
|