1. 程式人生 > 實用技巧 >佇列+排序(送禮物)

佇列+排序(送禮物)

阿麗莎公主邀請她的朋友們參加她的生日聚會。她的每個朋友都會帶來價值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
Output
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; } }