Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 31628 | Accepted: 11281 |
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 500010; long long cnt = 0; int a[maxn], t[maxn]; void merge_sort(int *A, int x, int y, int* T) {//contain [x,y] if(x==y) return ; // printf("x = %d, y = %d\n", x, y); if(y-x>=1) { int m = (x+y)/2; int p = x, q = m+1, i = x; merge_sort(A, x, m, T); merge_sort(A, m+1, y, T); while(p <= m || q <= y) { if(p<=m && q<=y && A[p]<=A[q]) { T[i++] = A[p++]; } if(p<=m && q<=y && A[p]>A[q]) { cnt = cnt + (m-p+1); // printf("cnt = %d\n", cnt); T[i++] = A[q++]; } while(q>y && p<=m) { T[i++] = A[p++]; } while(p>m && q<=y) { T[i++] = A[q++]; } } for( i = x; i <= y; i++) { A[i] = T[i]; } } } int main() { int n; while((scanf("%d", &n) != EOF) && n) { for(int i = 0; i < n; i++) { scanf("%d", &a[i]); } merge_sort(a, 0, n-1, t); printf("%lld\n", cnt); cnt = 0; } return 0; } /********************** 5 9 1 0 5 4 8 9 1 0 5 4 3 8 7 **************/