hdu5437 优先队列 长春网赛
优先队列做,然后遍历人数。
#include <queue> #include <stdio.h> #include <string.h> #define maxn 150010 using namespace std; struct node { int id; int val; friend bool operator < (node a ,node b){ if(a.val==b.val) return a.id > b.id; return a.val < b.val; } }a[maxn]; priority_queue<node>q; int n,x[maxn],ans[maxn]; char name[maxn][210]; int main() { int i,j,t,m,p; scanf("%d", &t); while(t--) { scanf("%d %d %d", &n, &m, &p); memset(x,0,sizeof(x)); for(i=1; i<=n; i++) { scanf("%s %d", name[i], &a[i].val); a[i].id=i; ans[i]=0; } for(i=0; i<m; i++) { int fx,fy; scanf("%d %d", &fx, &fy); x[fx]=fy; } int cou=1; for(i=1;i<=n;i++) { q.push(a[i]); for(j=0;j<x[i]&&!q.empty();j++) { node tt=q.top(); q.pop(); ans[cou++]=tt.id; } } while(!q.empty()) { node tt=q.top(); q.pop(); ans[cou++]=tt.id; } int flag=0; while(p--) { int fp; scanf("%d",&fp); if(!flag) printf("%s",name[ans[fp]]); else printf(" %s",name[ans[fp]]); flag=1; } printf("\n"); } }