zoukankan      html  css  js  c++  java
  • [51nod] 1019 逆序数

    要点:左右分治

    注解:使用了归并排序

    空间复杂度:NlogN

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    int val[1000000] = {0};
    int tmp[1000000] = {0};
    int ans = 0;
    
    void mergesort(int L,int R){
        if(L == R) return;
        mergesort(L,(L+R)/2);
        mergesort((L+R)/2+1,R);
        
        int p = L,lp = L,rp = (L+R)/2+1;
        while(p <= R){
            if(lp > (L+R)/2) tmp[p++] = val[rp++];
            else if(rp > R) tmp[p++] = val[lp++];
            else if(val[lp] <= val[rp]) tmp[p++] = val[lp++];
            else if(val[lp] > val[rp]) tmp[p++] = val[rp++],ans+=(L+R)/2-lp+1;
        }
    
        for(int i = L;i <= R;i++) val[i] = tmp[i];
    }
    
    int main(){
        int n;
        scanf("%d",&n);
        for(int i = 1;i <= n;i++) scanf("%d",&val[i]);
        if(n == 1) ans = 1;
        mergesort(1,n);
        printf("%d
    ",ans);
    //    for(int i = 1;i <= n;i++) printf("%d ",val[i]);
        return 0;
    }
    View Code
  • 相关阅读:
    3-2 案例准备工作
    3-1 Git下载与安装
    3-1 案例环境初始化
    1-2+并发编程初体验
    Linux
    HTTP
    Linux
    HTML
    Linux 命令
    MySQL
  • 原文地址:https://www.cnblogs.com/Chorolop/p/11997259.html
Copyright © 2011-2022 走看看