模拟比赛淘汰机制
#include <iostream>
#include <cstdio>
#include <vector>
#include <limits>
using namespace std;
vector<vector<int>> makeGroups(vector<int>& mice, int ng){
if(mice.size() <= 1) return vector<vector<int>>();
int n = mice.size()/ng + (mice.size() % ng ? 1 : 0);
vector<vector<int>> groups(n);
for(size_t i = 0; i < mice.size(); ++i){
groups[i/ng].push_back(mice[i]);
}
return groups;
}
int main(){
int np, ng;
scanf("%d%d", &np, &ng);
vector<int> weights(np), order(np), rank(np);
for(int i = 0; i < np; ++i)
scanf("%d", &weights[i]);
for(int i = 0; i < np; ++i)
scanf("%d", &order[i]);
while(true){
auto groups = makeGroups(order, ng);
if(groups.empty()){
int r = 1;
for(auto& m: order) rank[m] = r++;
break;
}
order.clear();
for(auto& group : groups){
int mouse, maxw = numeric_limits<int>::min();
for(auto& m : group){
if(maxw < weights[m]){
maxw = weights[m];
mouse = m;
}
}
order.push_back(mouse);
for(auto& m : group){
if(m != mouse) rank[m] = groups.size()+1;
}
}
}
for(size_t i = 0; i < rank.size(); ++i){
if(i) printf(" ");
printf("%d", rank[i]);
}
return 0;
}