题目:给一个n以内所有偶数的排列,将有序(从小到大1,3,5......n-1)的奇数列插入到偶数列中,使得形成的逆序对最少。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int c[maxn],n,a[maxn];
int lowbit(int x) {return x&-x;}
void update(int pos,ll val)
{
while(pos<=n)
{
c[pos]+=val;
pos+=lowbit(pos);
}
}
ll query(int pos)
{
ll ans=0;
while(pos>0)
{
ans+=c[pos];
pos-=lowbit(pos);
}
return ans;
}
priority_queue<int>q;
int main()
{
scanf("%d",&n);
ll ans=0;n/=2;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]/=2;
ans+=i-1-query(a[i]);
update(a[i],1);
}
for(int i=1;i<=n;i++)
{
q.push(a[i]);
if(!q.empty()&&q.top()>a[i])
{
ans+=q.top()-a[i];
q.pop();
q.push(a[i]);
}
}
printf("%lld\n",ans);
return 0;
}