题目地址:hdu-1394
从后往前update
每插入一个数便getsum一次 得到有多少比他小的数 便是这个位置的逆序对 把所有位置的逆序对加起来便可以得到逆序数
对与每个串来说,相对于上一个串只有第一个位置的数被挪到最后去了 所以逆序数的改变关系应该是
逆序数减去小于第一个数的个数再加上大于第一个数的个数
即 miin=sum - getsum(a[1]) + [n-1-getsum(a[1])]
找到最小的miin就好
#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
int c[100000],a[50005];
int n;
int lowbit(int x) {
return x&-x;
}
void updata(int n,int value) {
for(int i=n; i<=100000; i+=lowbit(i))
c[i]+=value;
}
int getsum(int n) {
int sum=0;
for(int i=n; i>0; i-=lowbit(i)) {
sum+=c[i];
}
return sum;
}
void show() {
for(int i=1; i<=n; i++)
cout<<c[i]<<' ';
cout<<endl;
}
int main() {
while(cin>>n) {
for(int i=1; i<=n; i++)
cin>>a[i];
int sum=0,miin;
memset(c,0,sizeof(c));
for(int i=n; i>0; i--) {
updata(a[i]+1,1);
sum+=getsum(a[i]);
}
miin=sum;
for(int i=1; i<n; i++) {
int t=getsum(a[i]);
sum=sum-t+n-t-1;
if(sum<miin)
miin=sum;
}
cout<<miin<<endl;
}
return 0;
}