《演算法競賽高階指南》黑盒子

2021-10-09 11:45:45 字數 1621 閱讀 6768

黑盒子代表乙個原始的資料庫。

它可以用來儲存整數陣列,並且它擁有乙個特殊變數i。

在最開始,黑盒子是空的,並且i=0。

現在對黑盒子進行一系列的操作處理,操作包括以下兩種:

1、add(x):表示將x加入到黑盒子中。

2、get:使i增加1,輸出黑盒子中第i小的數值(即將所有數按公升序排序後的第i個數)。

下面給出乙個具體例子:

序號 操作 i 盒子內數(公升序排列後) 輸出的值

1 add(3) 0 3

2 get 1 3 3

3 add(1) 1 1, 3

4 get 2 1, 3 3

5 add(-4) 2 -4, 1, 3

6 add(2) 2 -4, 1, 2, 3

7 add(8) 2 -4, 1, 2, 3, 8

8 add(-1000) 2 -1000, -4, 1, 2, 3, 8

9 get 3 -1000, -4, 1, 2, 3, 8 1

10 get 4 -1000, -4, 1, 2, 3, 8 2

11 add(2) 4 -1000, -4, 1, 2, 2, 3, 8

為了方便描述,下面我們定義兩個序列:

1、a(1),a(2),…,a(m):這個序列由加入到黑盒子內的所有元素按加入順序排列後得到,上例中的a序列為(3,1,-4,2,8,-1000,2)。

2、u(1),u(2),…,u(n): 這個序列的第i項表示的是第i次get操作時,盒子內元素的數量。上例中的u序列為(1,2,6,6)。

現在請你根據給出的序列a和u求出操作過程中輸出的所有數值。

輸入格式

輸入包括三行。

第一行包含兩個整數m和n,表示a序列和u序列的長度。

第二行包含m個整數,表示a序列的每乙個元素。

第三行包含n個整數,表示u序列的每乙個元素。

同行每個數之間用空格隔開。

輸出格式

輸出操作過程中所有get操作輸出的數值。

每個數值佔一行。

資料範圍

|a(i)|<=2∗109,

1≤n≤m≤30000,

對於所有p(1≤p≤n), p≤u§≤m成立

輸入樣例:

7 43 1 -4 2 8 -1000 2

1 2 6 6

輸出樣例:33

12

#include

#include

#include

#include

using namespace std;

const

int n=

30010

;int n,m;

int a[n]

,b[n]

;int

main()

j++;//注意j指標要前移

}//迴圈結束之後,我們要輸出的第幾小的這個排序應該加1

//所以只需要將小頂堆的堆頂彈出至大頂堆,就可以滿足這個條件

down.

push

(up.

top())

; up.

pop();

cout

)<}return0;

}

關於黑盒子測試

等價劃分 將所有可能的輸入資料劃分為若干個子集,然後從每個子集選取有代表性的資料作為測試用例。等價類 某個輸入域的子集合,各個輸入資料對於揭露程式中的錯誤是等效的。有效等價類 對於程式規格說明是合理的,有意義的輸入資料構成的集合,利用他檢驗程式是否實現了預知的功能。無效等價類 對於程式規格是不合理的...

黑盒子 對頂堆

我們的大根堆中的所有數都必須小於小根堆中的數。而且還要注意,i每一次都是要增加1的,所以我們每次做完get操作後,都需要最小堆中的最小數彈出存入最大堆,也就是滿足第k小,因為k就是i,所以我們要這麼處理。倆個堆維護乙個有序序列,求第k個小的數 include include include incl...

《演算法競賽高階指南》 防曬

有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...