就是裸的优先队列 (因为数据太小 了)
题意就是 一堆朋友拜访主人公 各自带了礼物
给你m次开门的机会,开门时 如果朋友没全部到齐,按以下规则
在第m次开门的时候 让礼物价值最大的前p个人进来,
全部人到齐后。让全部人进来,
求进门的人的顺序
对客人维护一个优先队列就可以了,对m,p 让前m个人进优先队列取前p个人就行了,因为数据小 暴力取就ok;
trick是 m次操作是不按顺序的,我们得排个序
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define inf 0x7fffffff
struct node
{
char name[205];
int val;
int num;
bool operator<( const node& b) const
{
if (val!=b.val)
return val<b.val;
else
return num>b.num;
}
};
node tm[150005];
priority_queue <node> qq;
node ans[150005];
struct comes
{
int l,r;
};
comes come[150005];
int cmp(comes a,comes b)
{
return a.l<b.l;
}
int main()
{
int t;
scanf("%d",&t);
int i;
while(t--)
{
while(!qq.empty())
qq.pop();
int ok=0;
int k,m,q;
scanf("%d%d%d",&k,&m,&q);
for (i=1;i<=k;i++)
{
scanf("%s %d",tm[i].name,&tm[i].val);
tm[i].num=i;
}
int tt,pp,j;
int last=1;
for (i=1;i<=m;i++)
{
scanf("%d%d",&tt,&pp);
come[i].l=tt;
come[i].r=pp;
}
sort(come+1,come+1+m,cmp);
for (i=1;i<=m;i++)
{
tt=come[i].l;
pp=come[i].r;
for (j=last;j<=tt;j++)
{
qq.push(tm[j]);
}
last=tt+1;
for (j=1;j<=pp;j++)
{
if (qq.empty())
{
break;
}
node tmp=qq.top();
qq.pop();
ans[++ok]=tmp;
}
}
for (j=last;j<=k;j++)
{
qq.push(tm[j]);
}
for (j=ok+1;j<=k;j++)
{
if (qq.empty())
break;
node tmp=qq.top();
qq.pop();
ans[j]=tmp;
}
int ttt;
int line=0;
for (i=1;i<=q;i++)
{
scanf("%d",&ttt);
if (!line)
printf("%s",ans[ttt].name);
else
printf(" %s",ans[ttt].name);
line=1;
}
printf("\n");
}
return 0;
}