時間限制: 1 sec
記憶體限制: 64 mb
提交: 94
解決: 58 [
提交][
狀態][
我的提交]
我們使用黑匣子的乙個簡單模型。它能存放乙個整數序列和乙個特定的變數i。初始時刻,黑匣子為空且i為0。這個黑匣子能執行兩類命令:
add x:把元素x放入黑匣子中(x的絕對值不超過2000000);
get :先將黑匣子中的i的值加1,然後輸出黑匣子中所有數中第i小的數(注意:這裡第i小的數是指將黑匣子中所有的數由小到大排序後第i個位置的數);
現在給處n條add和m條get命令,要求你輸出每條get命令執行後的值。
例如n=7 m=4的乙個例子:
第一行兩個整數n,m(m<n≤30000),表示add命令和get命令的條數;
第二行:n個空格分開的整數,依次表示n次add命令的元素
第三行:m個空格分開的整數,依次表示m次get命令在第幾次add命令之後
有m行,每行對應一條get命令的輸出結果
copy
(如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)
7 43 1 -4 2 8 -1000 2
1 2 6 6
331分析:2
首先這道題是肯定不能大暴力的qnq,也不能用優先佇列取出來了又塞回去,都是要t掉的2333333。應用兩個堆或優先佇列,乙個小根堆(a),乙個大根堆(b)(從a中彈出來的元素)。沒一次add操作先把該元素和(b)比較,把大的乙個塞進a。
p.s:b是空時直接進a,開始想b[0]為0,應該夠小了,忘了tm還有負數,,,,,2333333莫名wa了乙個中午23333qnq,,qnq
#include#include#include#include#include#includeusing namespace std;
int n,m,num,sum1,sum2,reout,now=1;
int small[300010],big[300010],op[300010];
void build_small(int x,int m)
}void up_build_small(int x,int m)
}void up_build_big(int x,int m)
}void putin_small(int x)
void putin_big(int x)
void popout_big()
void popout_small()
int main()
}for(int i=1;i<=out-reout;i++)
}return 0;
}
練習堆手寫優先佇列2333,插入元素時要從下往上維護堆23333333333 黑匣子多項式
有乙個黑匣子,黑匣子裡有乙個關於 x 的多項式 p x 我們不知道它有多少項,但已知所有的係數都是正整數。每一次,你可以給黑匣子輸入乙個整數,黑匣子將返回把這個整數代入多項式後的值。有乙個不可思議的 結論 你可以在兩步之內還原出整個多項式!這是如何做到的呢?首先,輸入 1 於是便得到整個多項式的所有...
Luogu1801 黑匣子 堆
傳送門 題意 給出兩種命令 add x 把 x 元素放進 black box get i 加 1,然後輸出 black box 中第 i 小的數。輸出每次get操作的結果。題解 注意到每次求的第k小中,k從1開始遞增。則維護乙個大根堆和乙個小根堆,大根堆裡記錄前k小的數字,小根堆裡記錄其他的數字。這...
黑匣子(優先佇列,大小根堆)
noi導刊2010提高 06 來自luogu 題目描述 black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,...