Time Limit: 1 second
Memory Limit: 128 MB算法
【問題描述】markdown
新年聯歡會上,G.Sha負責組織智力問答節目。G.Sha創建了一個很大很大的超級題庫,並衡量了每道題的難度wi。因爲不可讓選手
一上場就被絕頂難題撂倒,因此難度必須按部就班,從簡到繁。
G.Sha制定了一套具體的抽題規則。首先,每位選手的第1道題必定是當前題庫中最簡單的。每位選手的下一道題,必定是題庫中(1
)比剛剛答過的題嚴格地更難,(2)難度儘量低的題。固然,每道題使用一遍就從題庫中刪掉。(能夠參考樣例數據)
G.Sha剛開完聯歡會很累,因此他提供了抽題程序的日誌,但願你能重現答題的過程。
簡單起見,你只須要依次輸出每位選手都答了哪些難度的題就能夠了。
【數據規模】
40%的數據中,m≤50, n≤1000。
100%的數據中,m≤1000, n≤100000。
測試數據保證 ,即比賽中使用的題目,不只比題庫少,而且是遠遠的少。
測試數據保證每位選手都不會出現無題可選的狀況。
【提示】
本題數據嚴格而全面,請注意優化算法,謹防超時。
【輸入格式】測試
輸入文件 quiz.in 包含3 行。
第 1 行,整數 n, m。表明題庫最初的題目數 n,和選手數 m。
第 2 行,n個整數 wi,表明題目的難度,無序,0≤wi≤100000。
第 3 行,m個整數 ai,表明依次每位選手做答的題目數量。 優化
【輸出格式】ui
輸出文件quiz.out包含n行。
第i行,每行ai個整數,表明選手i回答的每道題目的難度。
選手和每位選手的題目均按比賽時間的推移有序。
說明:遊戲開始前的題庫是{30, 1, 7, 3, 1, 14, 8, 20, 2, 1, 999, 2}。
選手1,依次做答了1,2,3,7四道題。做答後題庫剩餘{30,1,14,8,20,1,999,2}。
選手2,依次做答了1, 2兩道題。做答後題庫剩餘{30, 14, 8, 20, 1, 999}。
選手3,依次做答了1, 8, 14三道題。做答後題庫剩餘{30, 20, 999}。
選手4,依次做答了20一道題,做答後題庫剩餘{30, 999}。
能夠注意到,選手1~3都答了難度爲1的題。這是由於難度1的題有3道,而對於每位選手來講難度都是遞增的,一位選手不可能連續答
一樣難度的題。
同理,選手1~2都答了難度爲2的題。
Sample Inputspa
12 4
30 1 7 3 1 14 8 20 2 1 999 2
4 2 3 1日誌
Sample Outputcode
1 2 3 7
1 2
1 8 14
20遊戲
【題目連接】:http://noi.qz5z.com/viewtask.asp?id=t056get
【題解】
把n個問題加入multiset題庫->int類型裏面就好;
每一個選手按照要求用upper_bound找比上一次大的數字就好;
簡直是模板題有木有。
輸出有點坑;每行最後一個數字後面有空格;
【完整代碼】
#include <cstdio>
#include <cmath>
#include <set>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXM = 1000+100;
multiset <int> tiku;
int n,m;
int a[MAXM];
int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);rei(m);
rep1(i,1,n)
{
int x;
rei(x);
tiku.insert(x);
}
rep1(i,1,m)
rei(a[i]);
rep1(i,1,m)
{
int now = -1;
rep1(j,1,a[i])
{
__typeof(tiku.begin()) t = tiku.upper_bound(now);
now = (*t);
printf("%d ",now);
tiku.erase(t);
}
puts("");
}
return 0;
}