首先用树状数组求出初始序列的逆序对数,再根据变化特征,因为所有的数都是在1 ~ n(由于用到树状数组每个输进来的数都加了1) 的,所以每次把末尾的数掉到序列前面时,减少的逆序对数为n-1-A[i] ,增加的逆序对数为A[i]-1 ,这样就可在所有的序列中找出含有逆序对最少的了!
import java.util.Arrays;
import java.util.Scanner;
public class hdu1394逆序数树状数组解决 {
static int max=100003;
static int c[]=new int[max];
static int data[]=new int [max];
static int lowbit(int i)
{
return i&(-i);
}
static void modify(int k,int d){
while(k<=max){
c[k]+=d;
k+=lowbit(k);
}
}
static int sum(int n){
int result=0;
while(n>0){
result+=c[n];
n-=lowbit(n);
}
return result;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext())
{
Arrays.fill(data, 0);
Arrays.fill(c, 0);
int num=in.nextInt();
for(int i=1;i<=num;i++)
{
data[i]=in.nextInt();
}
int ans=0;
for(int i=num;i>=1;i--)
{
ans+=sum(data[i]+1);
modify(data[i]+1,1);
}
// System.out.println(ans);
int temp=ans;
int result=ans;
for(int i=1;i<=num;i++)
{
ans=ans-data[i]+num-data[i]-1;
if(temp<ans)
{
result=temp;
}else
{
result=ans;
temp=ans;
}
}
System.out.println(result);
}
}
}