1 solutions
-
0
C :
#include <stdio.h> #include <string.h> typedef long long LL; int num[100005]; int backup[100005]; LL count_inversions(int a[], int b[], int low, int high) { int i, j, mid = (low + high) / 2; LL tot = 0; if(low == high) return 0; tot += count_inversions(b, a, low, mid) + count_inversions(b, a, mid + 1, high); int k = low; for(i = low, j = mid + 1; i <= mid && j <= high;) if(b[i] > b[j]) { a[k++] = b[j++]; tot += (mid - i + 1); } else { a[k++] = b[i++]; } while(i <= mid) { a[k++] = b[i++]; } while(j <= high) { a[k++] = b[j++]; } return tot; } int main() { int i, n; scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &num[i]); memcpy(backup, num, sizeof num); printf("%lld\n", count_inversions(num, backup, 0, n - 1)); return 0; }
C++ :
#include <iostream> using namespace std; int i,j,n,a[100001],b[100001]; long long k; void deseq(int l,int r) { int i,j,x,q,p; if (r-l>1) { x=(r+l)/2; q=l;p=x;i=l; deseq(l,x); deseq(x,r); while (i<r) { if (p>=r || (q<x && a[q]<=a[p])) {b[i++]=a[q++];} else {b[i++]=a[p++];k+=x-q;} } for (i=l;i<r;i++) { a[i]=b[i]; } } return; } int main() { cin>>n; if (n<=0) return 0; for (i=1;i<=n;i++) { scanf("%d",&a[i]); } deseq(1,n+1); cout<<k; return 0; }
- 1
Information
- ID
- 722
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By