Let { A1,A2,...,An } be a permutation of the set{ 1,2,..., n}. If i < j and Ai > Aj then the pair (Ai,Aj) is called an "inversion" of the permutation. For example, the permutation {3, 1, 4, 2} has three inversions: (3,1), (3,2) and (4,2).
The inversion table B1,B2,...,Bn of the permutation { A1,A2,...,An } is obtained by letting Bj be the number of elements to the left of j that are greater than j. (In other words, Bj is the number of inversions whose second component is j.) For example, the permutation:
{ 5,9,1,8,2,6,4,7,3 }
has the inversion table
2 3 6 4 0 2 2 1 0
since there are 2 numbers, 5 and 9, to the left of 1; 3 numbers, 5, 9 and 8, to the left of 2; etc.
Perhaps the most important fact about inversions is Marshall Hall's observation that an inversion table uniquely determines the corresponding permutation. So your task is to convert a permutation to its inversion table, or vise versa, to convert from an inversion table to the corresponding permutation.
Input:
The input consists of several test cases. Each test case contains two lines.
The first line contains a single integer N ( 1 <= N <= 50) which indicates the number of elements in the permutation/invertion table.
The second line begins with a single charactor either 'P', meaning that the next N integers form a permutation, or 'I', meaning that the next N integers form an inversion table.
Following are N integers, separated by spaces. The input is terminated by a line contains N=0.
Output:
For each case of the input output a line of intergers, seperated by a single space (no space at the end of the line). If the input is a permutation, your output will be the corresponding inversion table; if the input is an inversion table, your output will be the corresponding permutation.
Sample Input:
9 P 5 9 1 8 2 6 4 7 3 9 I 2 3 6 4 0 2 2 1 0 0
Sample Output:
2 3 6 4 0 2 2 1 0 5 9 1 8 2 6 4 7 3
------------------------------------------------------------------------------------------------------------------------------------------#include<stdio.h>
#include<string.h>
long aa[ 60 ] , bb [ 60 ] , n ;
long count ;
char ch[3] ;
int main()
{
int i , j , k ;
while( scanf("%ld" , &n ) !=EOF && n )
{
count = 0;
memset( aa ,0 , sizeof( aa)) ;
memset( bb , 0 , sizeof( bb ) );
memset( ch , '/0' , sizeof( ch )) ;
//input
scanf("%s" ,ch ) ;
for( i = 1 ; i<= n ; i++ )
{
scanf("%ld" , & aa[ i ] ) ;
}
//process
if( !strcmp(ch , "P") )
{
for( i = 1 ; i<= n ; i++ )
{
for( j = 1 ; j<= n ; j++ )
{
if( aa[ j ] > i )
count++ ;
else
if( aa[ j ] == i )
break ;
}
bb[ i ] = count ;
count = 0 ;
}//end for
for( i = 1; i< n ; i++ )
printf("%ld " , bb[ i ] ) ;
printf("%ld/n" , bb[ n ]) ;
}
else
{
for( i = 1 ; i<= n ; i++ )
{
j = 1 ;//
if( aa[ i ] > 0 )
{
//这里乱搞,头乱 ,也过了
while( aa[ i ] )
if( ! bb[ j++ ] )
aa[ i ] -- ;
while( bb[ j ]) j++ ;
bb[ j ] = i ;
}
else
if( aa[ i ] == 0 )
{
while( bb[ j ] ) j++ ;
bb[ j ] = i ;
}
} //end for
for( i = 1 ; i< n ; i++ )
printf("%ld " , bb[ i ] ) ;
printf("%ld/n" , bb[ n ]) ;
}
}
return 0 ;
}