【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 1000005 struct Node { int value, father, size; int child[2], depth[2]; }; Node a[MAXN]; int n, top, Stack[MAXN]; int x[MAXN], y[MAXN], size[MAXN], value[MAXN]; int merge(int x, int y) { if (x == 0) return y; if (y == 0) return x; if (a[x].value < a[y].value) swap(x, y); a[x].size += a[y].size; a[x].child[1] = merge(a[x].child[1], y); a[a[x].child[1]].father = x; a[x].depth[1] = 1 + max(a[a[x].depth[1]].child[0], a[a[x].child[1]].depth[1]); if (a[x].depth[1] > a[x].child[0]) { swap(a[x].depth[0], a[x].depth[1]); swap(a[x].child[0], a[x].child[1]); } return x; } int del(int x) { int tmp = merge(a[x].child[1], a[x].child[0]); a[tmp].father = 0; return tmp; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i].value); a[i].value -= i; a[i].size = 1; } for (int i = 1; i <= n; i++) { Stack[++top] = i; value[top] = a[i].value; size[top] = 1; x[top] = i; y[top] = i; while (top > 1 && value[top] < value[top - 1]) { top--; Stack[top] = merge(Stack[top], Stack[top + 1]); size[top] += size[top + 1]; y[top] = y[top + 1]; while (a[Stack[top]].size > (size[top] + 1) / 2) Stack[top] = del(Stack[top]); value[top] = a[Stack[top]].value; } } long long ans = 0; for (int i = 1; i <= top; i++) for (int j = x[i]; j <= y[i]; j++) ans += abs(value[i] - a[j].value); printf("%lld\n", ans); return 0; }