(hdu 5437)
优先队列模拟,共k个人,每个人有一个价值,m次进入,每次价值最大的进去,价值相同id小的先进去,a b前a个没进去的人进去b个,不够b个,都进去,m次操作后,剩下的都进去,最后输出查询的第i个进去的人的名字
需要注意的是,m是乱序给的,需要按照a进行排序
#include<bits/stdc++.h> using namespace std; const int maxn=150005; char name[maxn][205]; typedef pair<int,int> dl; dl pt[maxn],px[maxn]; int ans[maxn],T[maxn],k,m,Q,u,v; struct node{ int id,val; node(int a=0,int b=0):id(a),val(b){} bool operator < (const node& x)const{ if(x.val==val) return x.id<id; return x.val>val; } }; void input(){ scanf("%d%d%d",&k,&m,&Q); for(int i=1;i<=k;i++){ scanf("%s%d",name[i],&u); pt[i]=make_pair(i,u); } for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); px[i]=make_pair(u,v); } for(int i=0;i<Q;i++) scanf("%d",T+i); sort(px+1,px+1+m); } priority_queue<node> q; void solve(){ while(!q.empty())q.pop(); int cnt1=0,cnt2=0; for(int i=1;i<=m;i++){ while(cnt1<px[i].first){ cnt1++; q.push(node(pt[cnt1].first,pt[cnt1].second)); } int w=cnt2+px[i].second; while(cnt2<w&&!q.empty()){ ++cnt2; node tmp=q.top();q.pop(); ans[cnt2]=tmp.id; } } for(int i=cnt1+1;i<=k;i++) q.push(node(pt[i].first,pt[i].second)); while(!q.empty()){ ++cnt2; node tmp=q.top();q.pop(); ans[cnt2]=tmp.id; } bool ok=0; for(int i=0;i<Q;i++){ if(ok)putchar(' '); else ok=1; printf("%s",name[ans[T[i]]]); } puts(""); } int main(){ int t; scanf("%d",&t); while(t--){ input(); solve(); } return 0; }