阿丽莎公主邀请她的朋友们参加她的生日聚会。她的每个朋友都会带来价值v的礼物,而他们所有的礼物都会在不同的时间出现。由于大厅不够大,因此Alisha一次只能容纳几个人。她决定让具有最高价值的礼物的人首先进入。
每次Alisha打开门时,她都可以决定让p个人进入她的城堡。如果大厅中的人数少于p,则所有人员都会进入。在她所有的朋友都到达之后,阿里沙(Alisha)将再次打开门,这次,每个尚未进入的朋友都会进入。
如果有两个朋友带来了相同价值的礼物,那么最先出现的那个应该首先进入。给定一个查询n,请告诉Alisha谁是进入城堡的第n个人。
输入项
输入的第一行给出测试用例的数量T,其中1≤T≤15。
在每个测试用例中,第一行包含三个数字k,m和q,并用空格分隔。 k是她邀请的朋友数,其中1≤k≤150,000。在所有Alisha的朋友到达0≤m≤k之前,门会打开m次。 Alisha将有q个查询,其中1≤q≤100。
接下来的k行中的第i行给出了一个字符串Bi,该字符串由不超过200个英文字符组成,并且整数vi(1≤vi≤108)用空格分隔。 Bi是参加Alisha派对的第i个人的名字,Bi带来了价值vi的礼物。
接下来的m行中的每行包含两个整数t(1≤t≤k)和p(0≤p≤k),中间用空格分隔。第t个人到达后,门将打开,Alisha将让p个朋友进入她的城堡。
每个测试用例的最后一行将包含q个数字n1,…,nq,以空格分隔,这意味着Alisha想要知道谁是进入她城堡的第n1,...,nq个朋友。
注意:最多将有两个包含n> 10000的测试用例。
输出量
对于每个测试用例,输出对应的Alisha查询名称,并用空格分隔。
1 5 2 3 Sorey 3 Rose 3 Maltran 3 Lailah 5 Mikleo 6 1 1 4 2 1 2 3
Sorey Lailah Rose
Source
2015 ACM/ICPC Asia Regional Changchun Online
就是排序
#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<algorithm> #include<map> #include<string> #include <math.h> #include<memory.h> #include<cstring> #include<bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=2e5+110; struct node{ char name[200]; int vis;//标号 int val;// friend bool operator<(node x,node y){ if(x.val==y.val){ return x.vis>y.vis; } else{ return x.val<y.val; } } }a[maxn]; node now; int mm[maxn]; struct node1{ int km,rs; }aa[maxn]; bool cmp(node1 x,node1 y){ return x.km<y.km; } int p[maxn]; int z[maxn]; int main(){ int t; cin>>t; while(t--){ priority_queue<node>q1; int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++){ scanf("%s%d",a[i].name,&a[i].val); } for(int i=1;i<=m;i++){ scanf("%d%d",&aa[i].km,&aa[i].rs); } sort(aa+1,aa+m+1,cmp); int cnt=1; int top=1; for(int i=1;i<=m;i++){ while(cnt<=aa[i].km){//进队列 strcpy(now.name,a[cnt].name); now.val=a[cnt].val; now.vis=cnt; cnt++; q1.push(now); } while(aa[i].rs&&!q1.empty()){//出队列 aa[i].rs--; mm[top++]=q1.top().vis; q1.pop(); } } while(cnt<=n){//m次处理完后,最后剩下的全都要弄一下 strcpy(now.name,a[cnt].name); now.val=a[cnt].val; now.vis=cnt; q1.push(now); cnt++; } while(!q1.empty()){ mm[top++]=q1.top().vis; q1.pop(); } int l; for(int i=0;i<k;i++){ scanf("%d",&l); if(i) printf(" "); printf("%s",a[mm[l]].name); } if(t>=1) cout<<endl; } }