题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5437
思路:优先队列模拟,注意最后一次门外人全部进入。
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debu
using namespace std;
const int maxn=150000+50;
struct Node
{
int id,val;
Node(int id=0,int val=0):id(id),val(val) {}
bool operator < (const Node &rhs) const
{
if(val==rhs.val) return id>rhs.id;
else return val<rhs.val;
}
};
int t,n,m,Q;
vector<int> ans;
char name[maxn][250];
priority_queue<Node> q;
int val[maxn],open[maxn],cmd[maxn];
int main()
{
#ifdef debug
freopen("in.in","r",stdin);
#endif // debug
scanf("%d",&t);
while(t--)
{
ans.clear();
memset(open,0,sizeof(open));
scanf("%d%d%d",&n,&m,&Q);
for(int i=1; i<=n; i++)
scanf("%s%d",name[i],&val[i]);
for(int i=0; i<m; i++)
{
int id,num;
scanf("%d%d",&id,&num);
open[id]=num;
}
for(int i=0; i<Q; i++)
scanf("%d",&cmd[i]);
for(int i=1; i<=n; i++)
{
q.push(Node(i,val[i]));
int tot=open[i];
while(!q.empty()&&tot)
{
//cout<<q.top().id<<endl;
ans.push_back(q.top().id);
tot--,q.pop();
}
}
while(!q.empty())
{
//cout<<q.top().id<<endl;
ans.push_back(q.top().id);
q.pop();
}
for(int i=0; i<Q-1; i++)
printf("%s ",name[ans[cmd[i]-1]]);
printf("%s\n",name[ans[cmd[Q-1]-1]]);
}
return 0;
}