优先队列,,,真是个好东西。。
第一次用。。
http://www.cnblogs.com/Tinamei/p/4810190.html 看着别人的思路写出来的,,自己真是辣鸡
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
struct node{ //礼物价值以及对应ID
int v, id;
bool operator<(const node& a) const{ // 堆比较的时候要用。。
if(v==a.v)return id>a.id;
return v<a.v;
}
}no[150005];
char name[150005][220];//可以建立一个name 和 ID 的映射关系;;就不用多存一遍名字了
struct people{
int t,p;
bool operator<(const people& a)const{ // 快排
return t<a.t;
}
}p[150005];
int order[1500005];
int main(){
int T;
cin>>T;
while(T--){
int k,m,q;
cin>>k>>m>>q;
for(int i=1;i<=k;i++){
cin>>name[i];
cin>>no[i].v;
no[i].id=i;
}
priority_queue<node> qu;
int count=1;
for(int i=1;i<=m;i++){
cin>>p[i].t>>p[i].p;
}
sort(p+1,p+m+1);
int s=1;
for(int i=1;i<=m;i++){ // 前p[i]个人进队
for(;s<=p[i].t;s++){
qu.push(no[s]);
}
while(!qu.empty()&&p[i].p--){ // 如果 p个人出队,p>队列中的人 全出
node a=qu.top();
qu.pop();
order[count++]=a.id; //用 order数组来表示出队的ID顺序
}
}
for(;s<=k;s++){ // 最后人全部都进去
qu.push(no[s]);
}
while(!qu.empty()){ // 全部出来
node a=qu.top();
qu.pop();
order[count++]=a.id;
}
for(int i=0;i<q-1;i++){
int a;
cin>>a;
cout<<name[order[a]]<<" ";
}
int a;
cin>>a;
cout<<name[order[a]]<<endl;
}
}