POJ 2299 Ultra-QuickSort
题目的意思很明确,就是求逆序对,于是直接在归并排序里加上ans+=mid-i+1求解即可
代码如下:
#include <iostream> #define MAXN 500003 using namespace std; int N; long long ans; int a[MAXN] , t[MAXN]; void merge(int l , int r) { int mid = (l+r) >> 1 , i = l , j = mid+1 , s = l; while (s <= r) { if (j > r || (i <= mid && a[i] < a[j])) t[s++] = a[i++]; else { ans += mid-i+1; t[s++] = a[j++]; } } for (i = l;i <= r;i++) a[i] = t[i]; } void msort(int l , int r) { int mid = (l+r) >> 1; if (l == r) return ; msort(l,mid); msort(mid+1,r); merge(l,r); } int main () { while (cin >> N && N) { ans = 0; for (int i = 0;i < N;i++) cin >> a[i]; msort(0,N-1); cout << ans << endl; } return 0; }