黑匣子 NOI導刊2010提高(06) 題解

2021-08-18 23:18:12 字數 757 閱讀 3994

題目大意:一開始你有乙個空的陣列,有m個操作,有兩種操作,一種是往陣列裡加乙個數,另一種是先讓i++,然後讓你輸出陣列中第i小的數,i從0開始。

對於這道題,我們需要開兩個堆,乙個堆維護1~i內的數,維護成大根堆,乙個堆維護剩下的數(i+1~n),維護成小根堆(這裡的1~i和i+1~n是指將陣列裡的數),那這樣有什麼用呢?可以發現,每一次輸出時,我們只需要輸出第二個堆的堆頂即可,然後把它移到那個大根堆裡,再維護一下兩個堆,那麼插入操作怎麼辦呢,對於比大根堆的堆頂要大的數,它是不會影響到現在前i-1小的數的,所以就把它移到小根堆裡,否則,把它移到大根堆裡,然後把堆頂踢回小根堆,因為此時他已經不是第i-1大的了,然後再維護一下兩個堆即可,**如下:

#include #include #define ll long long

int n,m;

int a[200010];

int dui1[200010],dui2[200010];//堆1為大根堆,堆2為小根堆

int t1=0,t2=0;

void up1(int x)

}void down2(int x)

}void add2(int x)

//----------------------------------------------以上為堆的標準**

void add(int x)

void get()

int main()

get();//然後輸出一下

} }

黑匣子 NOI導刊2010提高(06)

題目描述 black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第...

NOI導刊2010提高(06) 黑匣子

black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第i小的數,...

P1801 黑匣子 NOI導刊2010提高(06)

black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第i小的數,...