就是裸的优先队列 (因为数据太小 了)
题意就是 一堆朋友拜访主人公 各自带了礼物
给你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; }