hdu 1394

来源:互联网 发布:手机淘宝页面不正常 编辑:程序博客网 时间:2024/05/21 17:30
#include <iostream>#include <stdio.h>#define MAX_N 5001#define INF 99999999using namespace std;int a[MAX_N], n;struct node{    int left, right, val;} tt[MAX_N * 3];void build(int left, int right, int index) {    tt[index].left = left;    tt[index].right = right;    tt[index].val = 0;    if (left == right) return;    int mid = (left + right) / 2;    build(left, mid, index * 2);    build(mid + 1, right, index * 2 + 1);}int query(int index, int left, int right) {    if (tt[index].left == left && tt[index].right == right)        return tt[index].val;    int mid = (tt[index].left + tt[index].right) / 2;    if (mid >= right) return query(index * 2, left, right);    if (mid < left) return query(index * 2 + 1, left, right);    return query(index * 2, left, mid) + query(index * 2 + 1, mid + 1, right);}void update(int index, int id) {    tt[index].val++;    if (tt[index].left == tt[index].right) return;    int mid = (tt[index].left + tt[index].right) / 2;    if (id <= mid) update(index * 2, id);    else update(index * 2 + 1, id);}int main() {    int i;    while (scanf("%d", &n) != EOF) {        build(0, n - 1, 1);        int sum = 0;        for (i = 0; i < n; i++) {            scanf("%d", &a[i]);            sum += query(1, a[i], n - 1);            update(1, a[i]);        }        int output = sum;        for (i = 0; i < n; i++) {            sum = sum - a[i] + (n - a[i] - 1);            if (sum < output) output = sum;        }        printf("%d\n", output);    }    return 0;}