优先队列练习题
有n个人依次进入城堡,每个人有礼物价值v,当第t个人到的时候,主人开门允许p个人进去(礼物价值越大越先进去,礼物价值一样时先到先进)。最后,主人会再开一次门,让还没有进去的人都按照优先级进去。然后有q个询问,问地nq进去的个的名字。
优先队列做,需要对t,p那组数据排序
#include<cstdio> #include<cmath> #include<queue> #include<vector> #include<iostream> #include<algorithm> using namespace std; struct node { char name[220]; int val,id; friend bool operator < (node a,node b) { if(a.val==b.val)return a.id>b.id; return a.val<b.val; } }a[200020]; int n,m,Q; priority_queue<node>q; vector<node>ans; struct query { int t,q; }qu[200020]; bool cmp(query a,query b) { return a.t<b.t; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&Q); while(!q.empty())q.pop(); ans.clear(); for(int i=1;i<=n;i++){ scanf("%s%d",a[i].name,&a[i].val); a[i].id=i; } int cnt=0,c=0; for(int i=0;i<m;i++) { scanf("%d%d",&qu[i].t,&qu[i].q); } sort(qu,qu+m,cmp); int j=1; for(int i=0;i<m;i++) { for(;j<=qu[i].t;j++) { q.push(a[j]); } if(q.size()<=qu[i].q) { while(!q.empty()) { ans.push_back(q.top()); q.pop(); } } else{ for(int k=0;k<qu[i].q;k++) { ans.push_back(q.top()); q.pop(); } } } while(j<=n)q.push(a[j++]); while(!q.empty()) { ans.push_back(q.top()); q.pop(); } while(Q--) { int t; scanf("%d",&t); if(Q==0)printf("%s\n",ans[t-1].name); else printf("%s ",ans[t-1].name); } } return 0; }