Inversion
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> #include<malloc.h> typedef struct Lt { int m; struct Lt *next; } Lt,*LP; int main() { int n,i; int input[52]; char ch; void Invertion (int input[],int n); void Permutation(int input[],int n); while(scanf("%d",&n)!=EOF&&n!=0) { getchar(); scanf("%c",&ch); memset(input,0,sizeof(input)); for (i=1;i<=n;i++) { scanf("%d",&input[i]); } switch(ch) { case 'P': Invertion (input,n); break; case 'I': Permutation(input,n); break; default: return 0; } } return 0; } void Invertion (int input[],int n) { int i,j; int *m=malloc((n+1)*sizeof(int)); for(i=0;i<=n;i++) { m[i]=0; } for(i=1;i<=n;i++) { for(j=1;j<=i;j++) { if (input[j]>input[i]) { m[input[i]]++; } } } for(i=1;i<n;i++) { printf("%d ",m[i]); } printf("%d\n",m[n]); free(m); } void Permutation(int input[],int n) { int i,j; LP p,q,s; LP slist=(LP)malloc(sizeof(Lt)); slist->m=0; slist->next=NULL; for(i=n;i>=1;i--) { q=(LP)malloc(sizeof(Lt)); q->m=i; q->next=NULL; j=0; p=slist; while(j<input[i]) { p=p->next; j++; } s=p->next; p->next=q; q->next=s; } for(p=slist->next;p->next!=NULL;p=p->next) { printf("%d ",p->m); } printf("%d\n",p->m); while (slist->next!=NULL) { q=slist->next; slist->next=q->next; free(q); } free(slist); }