队列模拟
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <stdio.h>
using namespace std;
int num;
int group;
struct Mouse
{
int weight;
int ranks;
int order;
Mouse(){};
Mouse(int w)
{
weight=w;
ranks=0;
order=0;
}
};
bool cmp(Mouse a,Mouse b)
{
return a.weight>b.weight;
}
int main()
{
//freopen("D:/test.txt","r",stdin);
cin>>num>>group;
int i=num;
int weig, ord;
vector<Mouse> ans;
vector<int> orde;
queue<Mouse> comp;
while(i)
{
cin>>weig;
Mouse m = Mouse(weig);
ans.push_back(m);
i--;
}
i=0;
while(i!=num)
{
cin>>ord;
ans[ord].order=i;
orde.push_back(ord);
i++;
}
for(i=0; i<num; i++)
{
comp.push(ans[orde[i]]);
}
int nug=num/group;
int lef=num%group;
int maxRank=0;
if(group==1){
vector<Mouse> a;
for(i=0;i<num;i++){
a.push_back(ans[i]);
}
sort(a.begin(),a.end(),cmp);
for(i=0;i<num;i++){
a[i].ranks=i+1;
}
for(i=0;i<num;i++){
for(int j=0;j<num;j++){
if(ans[i].order==a[j].order){
cout<<a[j].ranks;
if(i!=num-1){
cout<<" ";
}
}
}
}
return 0;
}
while(1)
{
int cnt=0;
Mouse m = Mouse();
for(i=0; i<nug; i++)
{
m=comp.front();
comp.pop();
if(comp.empty()){
break;
}
for(int j=1; j<group; j++)
{
if(m.weight<comp.front().weight)
m=comp.front();
comp.pop();
}
m.ranks++;
maxRank=m.ranks;
for(int k=0;k<num;k++){
if(ans[k].order==m.order){
ans[k].ranks=m.ranks;
break;
}
}
comp.push(m);
cnt++;
}
if(lef>0)
{
m=comp.front();
comp.pop();
if(comp.empty()){
break;
}
for(i=1; i<lef; i++)
{
if(m.weight<comp.front().weight)
m=comp.front();
comp.pop();
}
m.ranks++;
maxRank=m.ranks;
for(int k=0;k<num;k++){
if(ans[k].order==m.order){
ans[k].ranks=m.ranks;
break;
}
}
comp.push(m);
cnt++;
}
nug=cnt/group;
lef=cnt%group;
}
maxRank++;
int ran=0;
for(i=0;i<num;i++){
ans[i].ranks=maxRank-ans[i].ranks;
}
vector<int> ranknum;
for(int r=1;r<maxRank;r++){
for(i=0;i<num;i++){
if(ans[i].ranks==r){
ran++;
}
}
ranknum.push_back(ran);
}
for(int r=maxRank;r>1;r--){
for(i=0;i<num;i++){
if(ans[i].ranks==r){
ans[i].ranks=ranknum[r-2]+1;
}
}
}
cout<<ans[0].ranks;
for(i=1;i<num;i++){
cout<<" "<<ans[i].ranks;
}
return 0;
}