I used a line segment tree to calculate the number of reverse orders. This time I want to use a tree array to try it. The sad reminder is that I want to understand it for a long time .... I don't know enough about tree arrays. Tangle .... Question:
Minimum inversion number
Time Limit: 2000/1000 MS (Java/others) memory limit: 65536/32768 K (Java/Others)
Total submission (s): 2413 accepted submission (s): 1492
Problem descriptionthe inversion number of a given number sequence A1, A2,..., an is the number of pairs (AI, AJ) that satisfy I <j and AI> AJ.
For a given sequence of numbers A1, A2 ,..., an, if we move the first m> = 0 numbers to the end of the seqence, we will obtain another sequence. there are totally N such sequences as the following:
A1, A2,..., An-1, an (where m = 0-the initial seqence)
A2, A3,..., An, A1 (where M = 1)
A3, A4,..., An, A1, A2 (where m = 2)
...
An, A1, A2,..., An-1 (where M = N-1)
You are asked to write a program to find the minimum inversion number out of the above sequences.
Inputthe input consists of a number of test cases. each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the N integers from 0 to n-1.
Outputfor each case, output the minimum inversion number on a single line.
Sample Input
101 3 6 9 0 8 5 7 4 2
Sample output
16
AC code:
#include <iostream>#include <cstdio>#include <string.h>int num[5005];int total[5005];int n;int lowbit(int x){ return x&(-x);}void update(int x){while(x>0){ total[x]++; x-=lowbit(x);}//printf("***\n");}int add(int x){int ss=0;x+=1;while(x<=n){ ss+=total[x]; x+=lowbit(x);}return ss;}int main(){ //int n; while(~scanf("%d",&n)){ memset(num,0,sizeof(num));memset(total,0,sizeof(total));int sum=0;for(int i=0;i<n;++i){ scanf("%d",&num[i]); update(num[i]+1); sum+=add(num[i]+1);}//printf("sum===%d\n",sum);int k=0,s=sum;for(int i=0;i<n;++i){ k=sum-num[i]+(n-1-num[i]); sum=k; //printf("k==%d s==%d\n",k,s); if(k<s) s=k;}printf("%d\n",s); } return 0;}