hdu 5437 Alisha’s Party 优先队列

#include<bits/stdc++.h>
using namespace std;
const int N=150000+5;
struct node
{
    int v,id;
    char s[200+5];
    friend bool operator <(node n1,node n2)
    {
        if(n1.v==n2.v) return n1.id>n2.id;
        return n1.v<n2.v;
    }
};
node a[N];

struct data
{
    int num,cnt;
} b[N];

bool cmp(data n1,data n2)
{
    return n1.num<n2.num;
}

int c[100+5],d[N];
priority_queue<node>q;
int main()
{
    int _,i,j,k,m,p,cnt,st,t;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d%d%d",&k,&m,&p);
        for(i=0; i<k; i++)
        {
            scanf("%s%d",a[i].s,&a[i].v);
            a[i].id=i;
        }
        for(i=0; i<m; i++)
            scanf("%d%d",&b[i].num,&b[i].cnt);
        sort(b,b+m,cmp);
        for(i=0; i<p; i++)
            scanf("%d",&c[i]);
        while(!q.empty()) q.pop();
        cnt=1;
        j=0;
        for(i=0; i<m; i++)
        {
            for(; j<b[i].num; j++)
                q.push(a[j]);
            for(t=0; t<b[i].cnt; t++)
            {
                if(q.empty()) break;
                d[cnt++]=q.top().id;
                q.pop();
            }
        }
        for(;j<k; j++)
            q.push(a[j]);

        while(!q.empty())
        {
            d[cnt++]=q.top().id;
            q.pop();
        }
        st=0;
        for(i=0; i<p; i++)
        {
            if(st) printf(" ");
            else st++;
            printf("%s",a[d[c[i]]].s);
        }
        if(st) printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

posted @ 2015-09-13 15:34  xryz  阅读(101)  评论(0编辑  收藏  举报