HDU 5437 Alisha’s Party(优先队列)(2015网络赛长春站)

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int maxm=200005;
int ans[maxm];
int k,m,p;
struct node
{
    char name[205];
    int val;
    int id;
    bool operator<(const node &s)const
    {
        if(val!=s.val)
        {
            return val<s.val;
        }
        else
        {
            return id>s.id;
        }
    }
} q[maxm];
struct Node
{
    int d,f;
} t[maxm];
int cmp(Node p,Node q)
{
    return p.d<q.d;
}
void slove()
{
    priority_queue<node>Q;
    int j=0;
    node temp;
    int num=0;
    for(int i=0; i<m; i++)
    {
        for(; j<t[i].d; j++)
        {
            Q.push(q[j]);
        }
        for(int l=0; l<t[i].f; l++)
        {
            if(Q.empty())
            {
                break;
            }
            temp=Q.top();
            ans[++num]=temp.id;
            Q.pop();
        }
    }
    for(; j<k; j++)
    {
        Q.push(q[j]);
    }
    while(!Q.empty())//最后开门放剩下的人
    {
        temp=Q.top();
        ans[++num]=temp.id;
        Q.pop();
    }
}
int main()
{
    int y;
    scanf("%d",&y);
    while(y--)
    {
        scanf("%d%d%d",&k,&m,&p);
        for(int i=0; i<k; i++)
        {
            scanf("%s%d",&q[i].name,&q[i].val);
            q[i].id=i;
        }
        for(int i=0; i<m; i++)
        {
            scanf("%d%d",&t[i].d,&t[i].f);
        }
        memset(ans,0,sizeof(ans));
        sort(t,t+m,cmp);
        slove();
        int x;
        for(int i=0; i<p; i++)
        {
            scanf("%d",&x);
            if(i==0)
            {
                printf("%s",q[ans[x]].name);
            }
            else
            {
                printf(" %s",q[ans[x]].name);
            }
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(HDU 5437 Alisha’s Party(优先队列)(2015网络赛长春站))