ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

队列+排序(送礼物)

2020-09-12 21:02:12  阅读:197  来源: 互联网

标签:朋友 ch 队列 空格 include 测试用例 送礼物 Alisha 排序


阿丽莎公主邀请她的朋友们参加她的生日聚会。她的每个朋友都会带来价值v的礼物,而他们所有的礼物都会在不同的时间出现。由于大厅不够大,因此Alisha一次只能容纳几个人。她决定让具有最高价值的礼物的人首先进入。
每次Alisha打开门时,她都可以决定让p个人进入她的城堡。如果大厅中的人数少于p,则所有人员都会进入。在她所有的朋友都到达之后,阿里沙(Alisha)将再次打开门,这次,每个尚未进入的朋友都会进入。
如果有两个朋友带来了相同价值的礼物,那么最先出现的那个应该首先进入。给定一个查询n,请告诉Alisha谁是进入城堡的第n个人。

输入项
输入的第一行给出测试用例的数量T,其中1≤T≤15。
在每个测试用例中,第一行包含三个数字k,m和q,并用空格分隔。 k是她邀请的朋友数,其中1≤k≤150,000。在所有Alisha的朋友到达0≤m≤k之前,门会打开m次。 Alisha将有q个查询,其中1≤q≤100。
接下来的k行中的第i行给出了一个字符串Bi,该字符串由不超过200个英文字符组成,并且整数vi(1≤vi≤108)用空格分隔。 Bi是参加Alisha派对的第i个人的名字,Bi带来了价值vi的礼物。
接下来的m行中的每行包含两个整数t(1≤t≤k)和p(0≤p≤k),中间用空格分隔。第t个人到达后,门将打开,Alisha将让p个朋友进入她的城堡。
每个测试用例的最后一行将包含q个数字n1,…,nq,以空格分隔,这意味着Alisha想要知道谁是进入她城堡的第n1,...,nq个朋友。
注意:最多将有两个包含n> 10000的测试用例。

输出量
对于每个测试用例,输出对应的Alisha查询名称,并用空格分隔。

1
5 2 3
Sorey 3
Rose 3
Maltran  3
Lailah 5
Mikleo  6
1 1
4 2
1 2 3
Output
Sorey Lailah Rose

Source

2015 ACM/ICPC Asia Regional Changchun Online

就是排序

#pragma GCC optimize(2)
#include<cstdio>
#include<iostream> 
#include<algorithm>
#include<map>
#include<string> 
#include <math.h> 
#include<memory.h>
#include<cstring>
#include<bits/stdc++.h>
using namespace std; 
typedef long long ll; 
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const int maxn=2e5+110;
struct node{
    char name[200];
    int vis;//标号 
    int val;// 
    friend bool operator<(node x,node y){
        if(x.val==y.val){
            return x.vis>y.vis;
        }
        else{
            return x.val<y.val;
        }
    }
}a[maxn];
node now;
int mm[maxn];
struct node1{
    int km,rs;
}aa[maxn];
bool cmp(node1 x,node1 y){
    return x.km<y.km;
}
int p[maxn]; 
int z[maxn];
int main(){
    int t;
    cin>>t;
    while(t--){
        priority_queue<node>q1;
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++){
            scanf("%s%d",a[i].name,&a[i].val);
        }
        for(int i=1;i<=m;i++){
            scanf("%d%d",&aa[i].km,&aa[i].rs);
        }
        sort(aa+1,aa+m+1,cmp);
        int cnt=1;
        int top=1;
        for(int i=1;i<=m;i++){
            while(cnt<=aa[i].km){//进队列 
                strcpy(now.name,a[cnt].name);
                now.val=a[cnt].val;
                now.vis=cnt;
                cnt++;
                q1.push(now);
            }
            while(aa[i].rs&&!q1.empty()){//出队列 
                aa[i].rs--;
                mm[top++]=q1.top().vis;
                q1.pop();    
            }
        }
        while(cnt<=n){//m次处理完后,最后剩下的全都要弄一下 
            strcpy(now.name,a[cnt].name);
            now.val=a[cnt].val;
            now.vis=cnt;
            q1.push(now);
            cnt++; 
        }
        while(!q1.empty()){
            mm[top++]=q1.top().vis;
            q1.pop();
        }
        int l;
        for(int i=0;i<k;i++){
            scanf("%d",&l);
            if(i)
                printf(" ");
            printf("%s",a[mm[l]].name);
        }
        if(t>=1) 
            cout<<endl;
        }
}

 

标签:朋友,ch,队列,空格,include,测试用例,送礼物,Alisha,排序
来源: https://www.cnblogs.com/lipu123/p/13658595.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有