zoukankan      html  css  js  c++  java
  • 归并算法实现求解逆序对【模板】

    已用此模板过掉了好几题。

    #include<stdio.h>
    #define LL long long //以后可以考虑这样写 简洁
    
    int n,i,a[500010], b[500010];
    //需要开辟两个数组
    
    LL count(int l,int r)//统计[l ,r]的逆序对数
    {
        LL s=0;//初始化
        int mid=(l+r)/2, i=l, j=mid+1, k=l;
        //printf("%d 
    ", mid );
    
        if (l<mid) s+=count(l,mid);//计算累加左区间的逆序对
        if (mid+1<r) s+=count(mid+1,r);//计算累加右区间的逆序对
    
        while( i<=mid || j<=r )
        {
            while ( i<=mid && (j>r || a[i]<=a[j]) ){
                //printf("%d < %d", a[i], a[j] ); //左边理应小于右边(左边等级低 右边等级高)
                b[k++]=a[i++];
            }
            while ( j<=r && (i>mid || a[j]<a[i]) )
            {                        //右边的大于左边的进行计数
               // printf(" %d-<-%d ", a[j], a[i] );
                b[k++]=a[j++];
                s+=mid-i+1;
            }
        }
        for(i=l;i<=r;i++)
            a[i]=b[i];
        return s;
    }
    
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            for (i=0; i<n; i++)
                scanf("%d", &a[i]);
            printf("%lld
    ", count(0,n-1));
        }
        return 0;
    }
  • 相关阅读:
    动手动脑感想
    原码反码补码
    java测试感想
    报告
    假期报告
    假期报告
    java学习进度
    《大道至简》读后感
    2020/1/31 PHP代码审计之目录穿越漏洞
    [极客大挑战 2019]BabySQL
  • 原文地址:https://www.cnblogs.com/yspworld/p/4704171.html
Copyright © 2011-2022 走看看