关于归并逆序对
  • 板块P1908 逆序对
  • 楼主Kniqht
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/9/12 21:04
  • 上次更新2023/11/2 21:09:30
查看原帖
关于归并逆序对
315205
Kniqht楼主2023/9/12 21:04
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,a[N],tmp[N],cnt;
void merge_sort(int q[],int l,int r){
    if(l>=r) return;
    int mid=l+r>>1;
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    int i=l,j=mid+1,k=0;
    while(i<=mid&&j<=r){
        if(q[i]<=q[j]) tmp[++k]=q[i++];
        else tmp[++k]=q[j++],cnt+=mid-i+1;
    }
    while(i<=mid) tmp[++k]=q[i++];
  //这里为什么不会产生逆序对呢?cnt为什么不需要加上j-(mid+1)+1呢??
    while(j<=r) tmp[++k]=q[j++];
    for(i=l,j=1;i<=r;i++,j++) q[i]=tmp[j];
}
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    merge_sort(a,1,n);
    printf("%lld",cnt);
    return 0;
}// 
2023/9/12 21:04
加载中...