UVa 10810 Ultra-QuickSort(逆序对)

来源:互联网 发布:上海旋转餐厅知乎 编辑:程序博客网 时间:2024/06/08 20:00

题目描述:给出n个整数,求其逆序对个数。

数据范围:n<500,000, 整数<999,999,999

分析:使用归并排序求逆序对

/*PROG: UVa10810*/#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;#define MAXN 500010int a[MAXN], b[MAXN], c[MAXN];#define DEBUG 1#define LOG(...) do { if (DEBUG) fprintf(stderr, __VA_ARGS__); } while(0)typedef long long LL;LL Merge(int l, int r) {if (l >= r) return 0;int m = (l+r) >> 1;LL ret = Merge(l, m)+Merge(m+1,r);memcpy(b, a+l, sizeof(int)*(m+1-l));memcpy(c, a+m+1, sizeof(int)*(r-m));int i, j;i = j = 0;for (int k = l; k <= r; ++k) {if (i == m+1-l) a[k] = c[j++];else if (j == r-m) a[k] = b[i++], ret += r-m;else if (b[i] > c[j]) a[k] = c[j++];else a[k] = b[i++], ret += j;}return ret;}int main(void) {int n;while (scanf("%d", &n), n) {for (int i = 0; i < n; ++i)scanf("%d", a+i);printf("%lld\n", Merge(0, n-1));}return 0;}


0 0
原创粉丝点击