HDU5437 優先隊列

題目herephp

優先隊列練習題node

有n我的依次進入城堡,每一個人有禮物價值v,當第t我的到的時候,主人開門容許p我的進去(禮物價值越大越先進去,禮物價值同樣時先到先進)。最後,主人會再開一次門,讓尚未進去的人都按照優先級進去。而後有q個詢問,問地nq進去的個的名字。ios

優先隊列作,須要對t,p那組數據排序spa

#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
    char name[220];
    int val,id;
    friend bool operator < (node a,node b)
    {
        if(a.val==b.val)return a.id>b.id;
        return a.val<b.val;
    }
}a[200020];
int n,m,Q;
priority_queue<node>q;
vector<node>ans;
struct query
{
    int t,q;
}qu[200020];
bool cmp(query a,query b)
{
    return a.t<b.t;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&Q);

        while(!q.empty())q.pop();
        ans.clear();
        for(int i=1;i<=n;i++){
            scanf("%s%d",a[i].name,&a[i].val);
            a[i].id=i;
        }
        int cnt=0,c=0;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&qu[i].t,&qu[i].q);
        }
        sort(qu,qu+m,cmp);
        int j=1;
        for(int i=0;i<m;i++)
        {
            for(;j<=qu[i].t;j++)
            {
                q.push(a[j]);
            }
            if(q.size()<=qu[i].q)
            {
                while(!q.empty())
                {
                    ans.push_back(q.top());
                    q.pop();
                }
            }
            else{
                for(int k=0;k<qu[i].q;k++)
                {
                    ans.push_back(q.top());
                    q.pop();
                }
            }
        }
        while(j<=n)q.push(a[j++]);
        while(!q.empty())
        {
            ans.push_back(q.top());
            q.pop();
        }
        while(Q--)
        {
            int t;
            scanf("%d",&t);
            if(Q==0)printf("%s\n",ans[t-1].name);
            else printf("%s ",ans[t-1].name);
        }

    }
    return 0;
}
相關文章
相關標籤/搜索