1 solutions

  • 0
    @ 2024-12-11 0:33:47

    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