基礎演算法 黑匣子(BZOJ1194)

2021-07-26 08:02:13 字數 1423 閱讀 3420

時間限制: 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 4

3 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,...