3305: 逆序数
题目描述
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
输入
第1行:N,N为序列的长度(n <= 50000)
第2行:序列中的元素(0 <= A[i] <= 10^9)
第2行:序列中的元素(0 <= A[i] <= 10^9)
输出
输出逆序数
样例输入
4
2 4 3 1
样例输出
4
实际上是归并排序, 顺便求一下逆序数
#include <iostream> using namespace std; long long int a[50010], b[50010], temp[50010]; int cnt; void Merge(int left, int mid, int right) { int i = left, j = mid + 1, k = left; while(i <= mid && j <= right) { if(a[i] > a[j]) { temp[k ++] = a[j ++]; cnt = cnt + mid - i + 1; } else { temp[k ++] = a[i ++]; } } while(i <= mid) { temp[k ++] = a[i ++]; } while(j <= right) { temp[k ++] = a[j ++]; } for(i = left; i <= right; ++ i) { a[i] = temp[i]; } } void mergeSort(int left, int right) { if(left < right) { int mid = left + (right - left) / 2; mergeSort(left, mid); mergeSort(mid + 1, right); Merge(left, mid, right); } } int main() { int n, m; cin >> n; for(int i = 1; i <= n; ++ i) cin >> a[i]; mergeSort(1, n); // for(int i = 1; i <= n; ++ i) // cout << a[i] << " "; // cout << endl; cout << cnt << endl; return 0; }