码迷,mamicode.com
首页 > 其他好文 > 详细

Brainman

时间:2015-04-01 19:35:34      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

Brainman

Brainman

http://poj.org/problem?id=1804

求逆序数,用归并写的,不知道什么叫树状数组,以后看了再尝试

} else if (aux[i] > aux[j]) {
  sum += end1-i+1;
  a[t] = aux[j++];
} else {
  a[t] = aux[i++];
}

错写成

} else if (aux[i] > aux[j]) {
  sum += end1-i+1;
  a[t] = a[j++];
} else {
  a[t] = a[i++];
}

卡了我 1 小时,哭 …

#include <stdio.h>
#include <string.h>

const int maxn = 1005;
int a[maxn];
int aux[maxn];
int sum;

void merge(int l, int mid, int r) {
    int i = l;
    int j = mid+1;
    int end1 = mid;
    int end2 = r;

    for (int t = l; t <= r; t++) {
        aux[t] = a[t];
    }

    for (int t = l; t <= r; t++) {
        if (i > end1) {
            a[t] = aux[j++];
        } else if (j > end2) {
            a[t] = aux[i++];
        } else if (aux[i] > aux[j]) {
            sum += end1-i+1;
            a[t] = aux[j++];
        } else {
            a[t] = aux[i++];
        }
    }
}

void msort(int l, int r) {
    if (l < r) {
        int mid = (l + r) / 2;
        msort(l, mid);
        msort(mid+1, r);
        merge(l, mid, r);
    }
}

int main(void) {
    int t;
    int n;
    scanf("%d", &t);
    for (int j = 1; j <= t; j++) {
        sum = 0;
        memset(a, 0, sizeof(a));
        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        msort(0, n-1);
        printf("Scenario #%d:\n%d\n\n", j, sum);
    }

    return 0;
}

Brainman

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4384616.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!