原题链接:点击打开链接
题意:这个单词 “inversion number”是逆序数的意思,给出一个序列,将第一个数不断放置于最后一位 ,求在这些序列中 逆序数最小的是多少。
思路 :求逆序数,
code:
#include <iostream>
#include <algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
const int MAX=5e4+10;
int out[MAX],ps,a[MAX];
struct point
{
int i;
double l,r;
} p[MAX];
int lowbit(int x)
{return x&(-x);}
void modify(int pos,int num)
{
while(pos<=MAX)
{
out[pos]+=num;
pos+=lowbit(pos);
}
}
int sum(int pos)
{
int su=0;
while(pos>0)
{
su+=out[pos];
pos-=lowbit(pos);
}
return su;
}
int main()
{
// freopen("i.txt","r",stdin);
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
memset(out,0,sizeof(out));
int ans=0;
for( i=1; i<=n; i++)
{
scanf("%d",&a[i]);
a[i]++;//树状数组不能到0;
modify(a[i],1);
ans+=(i-sum(a[i]));前i个中数中 ,小于等于a[i]的数的个数
}
int tem=ans;
int m=n+1;
for(i=1;i<=n;i++)
{
for(j=i+1;j<m;j++)
{
if(a[i]>a[j])//跑一遍就知道为什么了
tem--;
if(a[i]<a[j])
tem++;
}
ans=min(ans,tem);
a[m++]=a[i];
}
printf("%d\n",ans);
}
return 0;
}