归并排序
const int maxn = 555555;
int n, a[maxn], b[maxn];
typedef long long ll;
ll mergesort(int l, int r) {
if (l == r) return 0;
ll cnt = 0;
int m = (l + r) >> 1;
cnt = mergesort(l, m) + mergesort(m + 1, r);
int i = l, j = m + 1, k = l;
while(i <= m && j <= r) {
if (a[i] <= a[j]) b[k++] = a[i++];
else {
b[k++] = a[j++];
cnt += (m - i + 1);
}
}
while(i <= m) b[k++] = a[i++];
while(j <= r) b[k++] = a[j++];
for (i = l; i <= r; i++) a[i] = b[i];
return cnt;
}
int main () {
while(~scanf("%d", &n) && n) {
for (int i = 0; i < n; i++) scanf("%d", a + i);
printf("%I64d\n", mergesort(0, n - 1));
}
return 0;
}//树状数组
const int maxn = 555555;
typedef long long ll;
int n;
ll a[maxn], pos[maxn];
struct node {
int v, i;
}e[maxn];
bool cmp(node s, node v){
return s.v < v.v;
}
inline int lowbit(int x) {
return (x & -x);
}
void update(int x, int v) {
for (int i = x; i <= n; i += lowbit(i)) a[i] += v;
}
ll query(int x) {
ll ret = 0;
for (int i = x; i; i -= lowbit(i)) ret += a[i];
return ret;
}
int main () {
while(scanf("%d", &n) && n) {
for (int i = 1; i <= n; i++) {
a[i] = 0;
scanf("%d", &e[i].v);
e[i].i = i;
}
//离散化
sort(e + 1, e + n + 1, cmp);
for (int i = 1; i <= n; i++) pos[i] = e[i].i;
int x;
ll ret = 0;
for (int i = 1; i <= n; i++) {
ret += query(pos[i]);
update(pos[i], 1);
}
printf("%I64d\n", (ll)n * (n - 1) / 2 - ret);
}
return 0;
}[POJ 2299] Ultra-QuickSort (逆序对的数目),布布扣,bubuko.com
[POJ 2299] Ultra-QuickSort (逆序对的数目)
原文:http://blog.csdn.net/sio__five/article/details/20869909