题目链接
注意
队列pop要判断是否为空,所以产生运行时错误!!!
找测试点可以通过注释某一个程序块!!!
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <cstdio> #include <queue> #include <vector> #include <algorithm> using namespace std;
int mice[101000]; int Rank[1010000000]; int main() { int np,ng,x; vector<int> vec,next_vec,left; vector<vector<int> > ans; priority_queue<int> q; scanf("%d%d",&np,&ng); for(int i=0;i<np;i++){ scanf("%d",&mice[i]); } for(int i=0;i<np;i++){ scanf("%d",&x); vec.push_back(x); } int k=0; while(true){ for(int i=0;i<vec.size();i++){ if(i%ng==0&&!q.empty()){ int t=q.top(); next_vec.push_back(t); q.pop(); while(!q.empty()){ left.push_back(q.top()); q.pop(); } } if (k==0) q.push(mice[vec[i]]); else q.push(vec[i]); } if(!q.empty()){ next_vec.push_back(q.top()); q.pop(); while(!q.empty()){ left.push_back(q.top()); q.pop(); } } ans.push_back(left); if(next_vec.size()==1){ ans.push_back(next_vec); break; } left.clear(); vec.swap(next_vec); next_vec.clear(); k++; } int len=ans.size(); int r=1,num=1; for(int i=len-1;i>=0;i--){ if(r<num) r=num; for(int j=0;j<ans[i].size();j++){ Rank[ans[i][j]]=r; num++; } r++; } for(int i=0;i<np;i++){ if (i!=0) printf(" "); printf("%d",Rank[mice[i]]); }
return 0; }
|