题目大意:Alisha过生日,邀请了k个人,没人带来了val的礼物,alisha会在所有人到来前开m次门,每次开门给两个数据t个人到了(按val值)放进去p个人,最后全放进去,最后询问q次的,问每次询问对应哪一个人进入。
思路:将进去的人扔进一个优先级队列,每次开门放进去的人,记录编号。要对开m次门进行排序,给定的值为无序状态。有个点没想到:最后是所有人全都放进去,然后每个人都会有顺序的。
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <fstream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <bitset> using namespace std; #define MAXN 200005 int ans[MAXN]; int k , m , p; struct node { char name[205]; int val; int pos; friend bool operator< (node n1 , node n2) { if(n1.val != n2.val) return n1.val < n2.val; else return n1.pos > n2.pos; } }arr[MAXN]; struct point { int fir ; int sec ; }arr2[MAXN]; bool cmp(struct point p1 , struct point p2) { return p1.fir < p2.fir; } void solve() { priority_queue<node> Q; node temp; int j = 0; int num = 0; for(int i = 0 ; i < m ; i ++) { for(; j < arr2[i].fir ; j ++) Q.push(arr[j]); for(int k = 0 ; k < arr2[i].sec ; k ++) { if(Q.empty()) break; temp = Q.top(); ans[++num] = temp.pos; Q.pop(); } } for(; j < k ; j ++) Q.push(arr[j]); //所有人都进去 while(!Q.empty()) { temp = Q.top(); ans[++num] = temp.pos; //所有人都要记录进去的顺序 Q.pop(); } } int main() { int t; scanf("%d" , &t); while(t--) { scanf("%d %d %d" , &k , &m , &p); for(int i = 0 ; i < k ; i ++) { scanf("%s %d" , &arr[i].name , &arr[i].val); arr[i].pos = i; } for(int i = 0 ; i < m ; i ++) scanf("%d %d" , &arr2[i].fir , &arr2[i].sec); sort(arr2 , arr2 + m , cmp); //开门时间给定的是无序 memset(ans , 0 , sizeof(ans)); solve(); int a; for(int i = 0 ; i < p ; i ++) { scanf("%d" , &a); printf("%s" , arr[ans[a]].name); if(i != p-1) printf(" "); } printf("\n"); } }