black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的.而i等於0。這個black box要處理一串命令。
命令只有兩種:
add(x):把x元素放進blackbox;
get:i加1,然後輸出blackhox中第i小的數。
記住:第i小的數,就是black box裡的數的按從小到大的順序排序後的第i個元素。例如:
我們來演示一下乙個有11個命令的命令串。(如下圖所示)
現在要求找出對於給定的命令串的最好的處理方法。add和get命令分別最多200000個。現在用兩個整數陣列來表示命令串:
1.a(1),a(2),…a(m):一串將要被放進black box的元素。每個數都是絕對值不超過2000000000的整數,m$200000。例如上面的例子就是a=(3,1,一4,2,8,-1000,2)。
2.u(1),u(2),…u(n):表示第u(j)個元素被放進了blaek box裡後就出現乙個get命令。例如上面的例子中u=(l,2,6,6)。輸入資料不用判錯。
輸入格式:
第一行,兩個整數,m,n。
第二行,m個整數,表示a(l)
……a(m)。
第三行,n個整數,表示u(l)
…u(n)。
輸出格式:
輸出black box根據命令串所得出的輸出串,乙個數字一行。
輸入樣例#1:
7 4輸出樣例#1:3 1 -4 2 8-1000 2
1 2 6 6
331對於30%的資料,m≤10000;2
對於50%的資料,m≤100000:
對於100%的資料,m≤200000。
因為他讓著輸出第i小的數,那麼前i小的數是多少是無關緊要的
我們可以把前i小的數放到乙個大根堆裡面,當大根堆的值大於i的時候我們可以把它後面的放到小跟堆裡面,
這樣就保證了小根堆的第乙個一定是第i小的,
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7const
int maxn=200001;8
void read(int &n)913
while(c>='
0'&&c<='9'
)14
15 flag==1?n=-x:n=x;16}
17 priority_queue ,greater >q;
18 priority_queue< int >p;
19int now=0;20
inta[maxn];
21int
b[maxn];
22int
pre;
23int
ls[maxn];
24int num=0;25
intmain()
2640 printf("
%d***\n
",q.size());
41 printf("
%d+++\n
",p.size());
42while(i==b[pre])
4350}51
return0;
52 }
P1801 黑匣子 NOI導刊2010提高(06)
題目描述 black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第...
P1801 黑匣子 NOI導刊2010提高(06)
black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第i小的數,...
洛谷P1801 黑匣子
題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...