今天写题又遇到这种问题,现在总结一下。
背景:给你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;
}
第二钟:树状数组