Note
-
网上代码大多用队列,我用的vector…
-
注意输入数据里的坑!!!
index -- 00 01 02 03 04 5 06 07 08 9 10 value -- 19 25 57 22 10 3 56 18 37 0 46
Code:
#include<bits/stdc++.h>
using namespace std;
struct mouse{
int weight,order_input,rank,index;
};
bool cmp1(struct mouse a,struct mouse b){
return a.weight>b.weight;
}
bool cmp2(struct mouse a,struct mouse b){
return a.order_input<b.order_input;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int np,ng,order;
cin>>np>>ng;
int weigh[np];
mouse m[np];
vector<mouse> v;
for(int i=0;i<np;i++)
cin>>weigh[i];
for(int i=0;i<np;i++){
cin>>order;
m[i].index=i;
m[i].order_input=order;
m[i].weight=weigh[order];
v.push_back(m[i]);
}
vector<mouse> vc;
int group=np%ng==0?np/ng:np/ng+1;;
while(group>0){
vc.clear();
int len=v.size();
group=len%ng==0?len/ng:len/ng+1;
if(group==1&&len==1) break;
for(int i=0;i<len;i+=ng){
int end=min(len,i+ng);
sort(v.begin()+i,v.begin()+end,cmp1);
int ii=v[i].index;
vc.push_back(m[ii]);
for(int j=i+1;j<end;j++){
int ji=v[j].index;
m[ji].rank=group+1;
}
}
v=vc;
}
m[v[0].index].rank=1;
sort(m,m+np,cmp2);
for(int i=0;i<np;i++){
if(i!=0) printf(" ");
printf("%d",m[i].rank);
}
return 0;
}