Alisha’s Party

优先队列,,,真是个好东西。。

第一次用。。

 

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;
        
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值