• 【归并排序 逆序对 模版】


    题目描述

    求逆序对a[i]>a[j],i<j的个数

    输入

    第一行n(<= 1000000)个数,第二行n个数,每个数在-1e8,1e8之间

    输出

    逆序对个数

    样例输入

    10 3 5 2 7 26 1 8 5 8 3

    样例输出

    18
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 typedef long long ll;
     7 const int N=1000005;
     8 int gi(){
     9     int str=0,f=1;char ch=getchar();
    10     while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0' && ch<='9')str=str*10+ch-'0',ch=getchar();
    12     return str*f;
    13 }
    14 int a[N],temp[N];ll ans=0;
    15 void deal(int l,int mid,int r)
    16 {
    17     int i=l,j=mid+1,m=0,len=r-l+1;
    18     while(i<=mid && j<=r)
    19     {
    20         if(a[j]<a[i])temp[++m]=a[j++],ans+=(mid-i+1);
    21         else temp[++m]=a[i++];
    22     }
    23     if(i>mid)while(j<=r)temp[++m]=a[j++];
    24     else while(i<=mid)temp[++m]=a[i++];
    25     for(int i=1;i<=len;i++)a[l+i-1]=temp[i];
    26 }
    27 void merge(int l,int r)
    28 {
    29     int mid;
    30     if(l<r)
    31     {
    32         mid=(l+r)>>1;
    33         merge(l,mid);merge(mid+1,r);
    34         deal(l,mid,r);
    35     }
    36 }
    37 int main()
    38 {
    39     int n=gi();
    40     for(int i=1;i<=n;i++)a[i]=gi();
    41     merge(1,n);
    42     printf("%lld",ans);
    43     return 0;
    44 }
  • 相关阅读:
    hello , world Tkinter代码描述
    Tkinter 类
    什么是Tkinter?
    99_恢复二叉搜索树
    总结eclipse中常用好用的快捷键或者自定义一下快捷键:
    封装与职责分离的开发思维
    正在学习的路上
    串比较
    坚持的力量 第二十篇
    串连接
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7025815.html
Copyright © 2020-2023  润新知