今天写题又遇到这种问题,现在总结一下。

背景:给你n个数,求逆序对的对数。

第一种:归并统计

求逆序对的两种方法

这种方法较为简单,结合上图+代码 很快就可理解。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5+100;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
int a[N],t[N],n;
ll ans;
void Merge(int l,int r)
{
    if(l >= r) return ;
    int mid = (l + r) / 2;
    Merge(l,mid);Merge(mid+1,r);
    int i = l,j = mid + 1,k = l;

    while(i <= mid && j <= r){
        if(a[i] <= a[j])
            t[k++] = a[i++];
        else{
            t[k++] = a[j++];
            ans += (mid - i + 1);
        }
    }
    while(i <= mid) t[k++] = a[i++];
    while(j <= r) t[k++] = a[j++];
    for(int i = l;i <= r;i ++) a[i] = t[i];
}
int main()
{
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++) scanf("%d",&a[i]);
    Merge(1,n);
    cout << ans;
	return 0;
}

第二钟:树状数组

 

相关文章: