注意题目中的第三行的元素ci是第二行bi的位置信息。
也就是说是吧第二行的第【ci】个元素放到第三行第【i】的位置。
然后按NG的大小进行排序。我这里为了排名方便,用了两个数组维护进入下一轮和没有进入下一轮的位置。感觉反而变得比较繁琐了。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#define MAX 1010
using namespace std;
int np,ng;
int l[MAX];
int r[MAX];
map <int,int> no2pos;
map <int,int> no2rank;
vector <int> r1,r2;
vector <int> nex[MAX];
bool cmp(int p1 ,int p2){
return l[p1] > l[p2];
}
bool cmp2(int n1,int n2){
return n1 > n2 ;
}
void sortlist(int n){
int i = 0;
r1 = nex[n];
r2.clear();
while(i + ng - 1 < r1.size()){
sort(r1.begin()+i,r1.begin()+i+ng,cmp2);
for(int j = 0 ;j < ng ;j++){
if(j == 0)
nex[n-1].push_back(r1[i+j]);
else
r2.push_back(r1[i+j]);
}
i = i + ng;
}
if(i < r1.size()){
sort(r1.begin()+i,r1.end(),cmp2);
for(int j = 0 ;j < ng && i+j < r1.size() ;j++){
if(j == 0)
nex[n-1].push_back(r1[i+j]);
else
r2.push_back(r1[i+j]);
}
}
nex[n] = r2;
}
int main(){
scanf("%d%d",&np,&ng);
for(int i = 0 ;i < np ;i++){
scanf("%d",&l[i]);
}
int times = 1,sum = np;
while(sum != 1){
int l = (sum % ng == 0)? 0:1;
sum = sum / ng + l;
times++;
}
int pos;
for(int i = 0 ; i < np ;i++){
scanf("%d",&pos);
no2pos[l[pos]] = pos;
nex[times].push_back(l[pos]);
}
int t = times;
while(t > 0)
sortlist(t--);
int RANK = 1;
for(int i = 0 ;i <= times;i ++){
for(int j = 0 ;j < nex[i].size(); j++)
r[no2pos[nex[i][j]]] = RANK;
RANK += nex[i].size();
}
printf("%d",r[0]);
for(int i = 1 ;i < np ;i++)
printf(" %d",r[i]);
printf("\n");
return 0;
}