题目是中文的。。
其实就是求一个序列的逆序对数,裸题。
用分治的思想来做,并归排序稍微修改下就可以了。
代码:
/*
* Author: illuz <iilluzen@gmail.com>
* Blog: http://blog.youkuaiyun.com/hcbbt
* File: rqnoj173.cpp
* Lauguage: C/C++
* Create Date: 2013-08-30 09:45:28
* Descripton: rqnoj 1173, partitation
*/
#include <cstdio>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repu(i, a, b) for (int i = (a); i < (b); i++)
const int MAXN = 1000100;
int n, cnt, a[MAXN], t[MAXN];
void merge(int l, int r) {
if (r - l <= 1) return;
int m = l + (r - l) / 2;
merge(l, m);
merge(m, r);
int p = l, q = m, i = l;
while (p < m || q < r)
if (q >= r || (p < m && a[p] <= a[q]))
t[i++] = a[p++];
else
t[i++] = a[q++], cnt += m - p;
repu(i, l, r) a[i] = t[i];
}
int main() {
scanf("%d", &n);
rep(i, n) scanf("%d", &a[i]);
cnt = 0;
merge(0, n);
printf("%d\n", cnt);
return 0;
}
逆序数计算与归并排序应用
该博客主要讨论了如何利用分治思想解决求序列逆序对数的问题,将归并排序进行适当修改以实现这一目标。文章适合ACM竞赛爱好者阅读,通过实例解析算法实现。
2199

被折叠的 条评论
为什么被折叠?



