#include <stdio.h>
#include <stdlib.h>
typedef struct mouse{
int rank,fat;
}Mouse;
int compare(const void *a,const void *b){
return (((const Mouse*)b)->rank-((const Mouse*)a)->rank);
}
int main() {
int N,k,level_cnt,level[1001]={0};
scanf("%d %d",&N,&k);
if(N%k==0) level_cnt=N/k;
else level_cnt=N/k+1;
int *queue=(int*)malloc(sizeof(int)*N);
int *a=(int*)malloc(sizeof(int)*N);
Mouse *ans=(Mouse*)malloc(sizeof(Mouse)*N);
for(int i=0;i<N;i++){
scanf("%d",&ans[i].fat);
a[i]=ans[i].fat;
}
int rear=0,current=N;
while(rear<N){
int t;
scanf("%d",&t);
queue[rear++]=ans[t].fat;
}
int i=0,j;
while(1){
int max=-1;
if(i+k<=current){
for(j=i;j<i+k;j++){
if(queue[j]>max)
max=queue[j];
level[queue[j]]++;
}
queue[rear++]=max;
i=i+k;
}else{
for(j=i;j<current;j++){
if(queue[j]>max)
max=queue[j];
level[queue[j]]++;
}
queue[rear++]=max;
i=j;
}
if(level[max]==level_cnt) break;
if(j==current){
current=rear;
}
}
for(int l=0;l<N;l++){
ans[l].rank=level[ans[l].fat];
printf("%d ",ans[l].rank);
}
printf("\n");
qsort(ans, N, sizeof(Mouse), compare);
for(int l=0;l<N;l++){
printf("%d ",ans[l].rank);
}
printf("\n");
for(int l=0;l<N;l++){
if(l==0){
level[ans[0].fat]=1;
}else{
int m=l;
while(ans[m].rank==ans[m-1].rank)
m--;
level[ans[l].fat]=m+1;
}
}
for(int l=0;l<N;l++){
if(l==0)
printf("%d",level[a[l]]);
else
printf(" %d",level[a[l]]);
}
free(ans);
free(a);
free(queue);
return 0;
}
最后一张答案正确,主要是为了输出倒数第三行的正确排名。