zoukankan      html  css  js  c++  java
  • 【模板】【CDQ】【归并排序】【求逆序对】

    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int n;
    const int N=500003;
    int d[N],t[N];
    long long sum;
    
    void CDQ(int l,int r)
    {
        if(l==r) return ;
        int t1=l,mid=(l+r)>>1,t2=mid;
        CDQ(l,mid);
        CDQ(++t2,r);
        
        int pos=t1;
        while(t1<=mid && t2<=r)
            if(d[t1]<=d[t2])
                t[pos++]=d[t1++];
            else
            {
                sum+=mid-t1+1;
                t[pos++]=d[t2++];
            }
        //会产生贡献的范围:
        //i<=mid && d[i]>d[j] && j<=r
        //而我们是从前往后添加t数组,在意的是d[j]而非d[i],
        //假如一个d[i]有贡献,那他的贡献就是比他小的j最大的那个d[j],全部贡献都是由j++来提供的
        //所以如果有t1剩余,也不会再产生贡献 
        while(t2<=r) t[pos++]=d[t2++];
        while(t1<=mid) t[pos++]=d[t1++];
        for(int i=l;i<=r;i++) d[i]=t[i];
    }
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&d[i]);
        
        CDQ(1,n);
        printf("%lld
    ",sum);
        return 0;
    }
  • 相关阅读:
    备份
    Ibatis_dataMapper
    查询成绩都大于80分的学生
    删除文件的工具
    从运行中启动收索引擎
    数据库Northwind
    搭建Android开发环境
    数据库知识结构
    数据库MedicineMis_STD
    数据库work
  • 原文地址:https://www.cnblogs.com/xwww666666/p/11293799.html
Copyright © 2011-2022 走看看