解题思路: 自己按照自己的思路乱模拟时间超限,看了别人的题解学习学习首先对m次开门按t进行升序排序,然后优先队列模拟进门即可
#include <iostream> #include "stdio.h" #include "stdlib.h" #include "string.h" #include "algorithm" #include "queue" #define N 50005 using namespace std; struct node{ char name[205]; int val,id; bool operator <(const struct node a) const { return val==a.val?id>a.id:val<a.val; } }mess[150005],to[150005]; struct pnode{ int t,p; bool operator < (const struct pnode a) const { return t<a.t; } }en[150005]; int main(void) { int T; int query[105]; scanf("%d",&T); while(T--) { priority_queue <struct node> qq; int k,m,q,maxn; maxn=0; scanf("%d%d%d",&k,&m,&q); for(int i=0;i<k;i++) { scanf("%s%d",mess[i].name,&mess[i].val); mess[i].id=i; } for(int i=0;i<m;i++) scanf("%d%d",&en[i].t,&en[i].p); en[m].t=k;en[m].p=k; for(int i=0;i<q;i++) { scanf("%d",&query[i]); maxn=max(query[i],maxn); } sort(en,en+m); int op,pos; op=0;pos=1; for(int i=0;i<=m;i++) { while(op<en[i].t) { qq.push(mess[op++]); } while(!qq.empty() && en[i].p-- && pos<=maxn) { to[pos++]=qq.top(); qq.pop(); } if(pos>maxn) break; } for(int i=0;i<q-1;i++) printf("%s ",to[query[i]].name); printf("%s\n",to[query[q-1]].name); } }