2021牛客暑期多校训练营4
Inverse Pair
题意:
就是求逆序对数量,多了一步操作,可以选择将序列中的元素+1,使得逆序对数量最少。
分析:
两个数值相差1的元素成逆序对,小的数+1才会使逆序对数量-1,并且不会对其它逆序对产生影响,并且数值相差1的元素要两两配对,例如:5,4,3; 5和4配对,4变成5,4就不能和3配对了
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int a[N], t[N], b[N], ans;
void mergesort(int l,int r)
{
if(l==r) return;
int mid = (l+r)>>1;
mergesort(l,mid);
mergesort(mid+1,r);
int i=l, j=mid+1, p=l;
while(i<=mid && j<=r)
{
if(a[i] > a[j])
{
t[p++]=a[j++];
ans += mid-i+1;// 左区间剩余的数都要比右区间大
}
else t[p++]=a[i++];
}
while(i<=mid) t[p++]=a[i++];
while(j<=r) t[p++]=a[j++];
for(int i=l;i<=r;i++) a[i]=t[i];
}
signed main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[a[i]] = i;
}
mergesort(1,n);
//cout<<ans<<endl;
int p=1;
while(p<n){
if(b[p]>b[p+1]){
ans--;
p+=2;
}
else{
p+=1;
}
}
cout<<ans;
return 0;
}