这道题先前用暴力枚举了一遍,
然后有用线段树做了一遍~~~~当插入一个数时,先查询这个数之前有多少个数比它大,最终得到的就是初始的逆序数对:
附上代码:(敲代码的时候要小心点,不然很容易就出错,还不知到错在哪 汗!!!!)
#include <iostream>
#define N 10000
using namespace std;
struct node
{
int num,l,r;
}st[N*4];
int a[N];
void build(int v,int l,int r)
{
st[v].l=l;
st[v].r=r;
st[v].num=0;
if(l==r)return;
int mid=(st[v].l+st[v].r)/2;
build(2*v,l,mid);
build(2*v+1,mid+1,r);
st[v].num=st[v*2].num+st[v*2+1].num;
}
void insert(int v,int w)
{
if(st[v].l==st[v].r)
{
st[v].num++;
return;
}
int mid=(st[v].l+st[v].r)/2;
if(w<=mid)
insert(2*v,w);
else
insert(2*v+1,w);
st[v].num=st[2*v].num+st[v*2+1].num;
}
int query(int v,int l,int r)
{
if(st[v].l==l&&st[v].r==r)
{
return st[v].num;
}
int mid=(st[v].l+st[v].r)/2;
if(l>mid)
return query(2*v+1,l,r);
else if(r<=mid)
return query(2*v,l,r);
else
return query(2*v,l,mid)+query(2*v+1,mid+1,r);
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
build(1,0,n-1);
int sum=0,ans=0;
for(int i=0;i<n;i++)
{
sum+=query(1,a[i],n-1);
insert(1,a[i]);
}
ans=sum;
for(int i=0;i<n;i++)
{
sum+=n-1-2*a[i];
if(ans>sum)ans=sum;
}
cout<<ans<<endl;
}
return 0;
}