3627 - 倒置表

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

{ A1,A2,……}是一个排列的集合{ 1,2,n }。给定序列Aa1,a2,a3....an,如果i<jai>aj(ai,aj)称为序列A

一个倒置。

之后引出了序列的倒置表

例如:给出序列A 5,9,1,8,2,6,4,7,3

则其倒置表为:2 3 6 4 0 2 2 1 0

这里倒置表的第一个数据是2,则表示在序列A中与1形成倒置的有两个即:(5,1) (9,1),以此类推。。

也所以你的任务是将其倒置表的排列,或反之亦然,从一个反演表转换到相应的置换。

题目输入

输入包含多个测试用例。每个测试用例包含两行。

第一行包含一个整数(1 < = N < = 9)这表明置换/颠倒的元素数量表。                                                                  

第二行始于足下特征“P,这意味着接下来的N个整数形式排列,或“I,也就是说,接下来的N个整数形式一个倒置表。

以下是N个整数,用空格分开。输入终止行包含N = 0。

题目输出

对于每个输入输出一行隔一个空格.如果输入是一个排列,输出将相应的反演表;如果输入是一个反演表,你的输出将

会相应的置换。

输入/输出样例

输入格式

9
P 5 9 1 8 2 6 4 7 3
9
I 2 3 6 4 0 2 2 1 0
0

输出格式

2 3 6 4 0 2 2 1 0
5 9 1 8 2 6 4 7 3

C++解答

#include <stdio.h>
int main()  
{  
   //freopen("test.in.txt","r",stdin);
   //freopen("test.out","w",stdout); 
   int n,i,j,k,m,y;   
   while(scanf("%d",&n)!=EOF&&n!=0)
   {  
      int a[n];  
      int b[n];   
      char c;  
      for(i=0;i<n;i++)  
            b[i]=0;  
        scanf("%c",&c); 
      for(i=0;i<n;i++)  
          scanf("%d",&a[i]); 
      if(c=='P')  
      {  
          for(i=0;i<n;i++)  
            {  
                k=i+1;  
                y=0;  
                while(k--)  
                {
                    if(a[i]<a[k])  
                        y++;
					}
                b[a[i]-1]=y;  
            }  
            for(i=0;i<=n-1;i++)  
            {  
                if(i==0)  
                    printf("%d",b[i]); 
                else  
                     printf(" %d",b[i]); 
            }  
           printf("\n");    
      }  
      else if(c=='I')  
      {   
          for(i=0;i<n;i++)  
            {  
                j=0;   
                k=i+1;  
                m=a[i];   
                while(m+1)  
                {   
                    if(b[j]==0)  
                        m--;  
                    j++;  
                }   
                b[j-1]=k;   
            }  
            for(i=0;i<n;i++)  
            {  
                if(i==0)  
                    printf("%d",b[i]); 
                else  
                    printf(" %d",b[i]); 
            }  
             printf("\n");    
      }                        
   }  
   return 0;    
}