wikioi 2573 大頂堆與小頂堆並用

2021-09-07 05:54:41 字數 1733 閱讀 6902

我們使用黑匣子的乙個簡單模型。它能存放乙個整數序列和乙個特別的變數i。在初始時刻。黑匣子為空且i等於0。

這個黑匣子能執行一系列的命令。有兩類命令:

add(x):把元素x放入黑匣子。get:把i加1的同一時候,輸出黑匣子內全部整數中第i小的數。牢記第i小的數是當黑匣子中的元素已非降序排序後位於第i位的元素。

以下的表6_4是乙個11個命令的樣例:

表6_4

編號命令

i黑匣子內容輸出1

add(3)03

2get13

33add(1)

11,3

4get

21,335

add(-4)

2-4,1,3

6add(2)

2-4,1,2,3

7add(8)

2-4,1,2,3,8

8add(-1000)

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

9get

3-1000,-4,1,2,3,8110

get4

-1000,-4,1,2,3,8211

add(2)

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

現須要乙個有效的演算法處理給定的一系列命令。

add和get命令的總數至多個有30000個。定義add命令的個數為m個。get命令的個數為n個。

我們用以下得兩個整數序列描寫敘述命令序列:

1.a(1),a(2),……,a(m):增加黑匣子的元素序列。全部的數均為絕對值不超過2000000的整數。

比如在上例中a=(3,1,-4,2,8,-1000,2)。

2.u(1),u(2),……,u(n):u(i)表示第i個get命令在第u(i)個add命令之後,比如在上例中,u=(1,2,6,6)。

你能夠假定自然數序列u(1),u(2),……,u(n)以非降序排列。n≤m,且對於每個p(1≤p≤n)有p≤u(p)≤m。

第一行存放m和n的值,第二行存放 a(1),a(2),……,a(m) ,第三行存放u(1),u(2),……,u(n)。

輸出黑匣子的處理結果。

7 4

3 1 -4 2 8 -1000 2

1 2 6 6

331

2

剛開始並不知道這題該怎樣下手。知道是堆做了。

可是詳細也不知道怎麼做。

看了這第二個解題報告了才知道怎樣做:第二個解題報告,思想非常好)

#include#include#include#include#include#include#include#include#define inf 100007

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

priority_queue,greater>heap_small;

priority_queueheap_big;

int a[30005],b[30005];

int main()

}while(i==b[jj])

return 0;

}

大頂堆小頂堆

堆通常是乙個可以被看做一棵完全二叉樹的陣列物件 如果對一棵有n個結點的完全二叉樹的結點按層序編號 從第1層到第 1層,每層從左到右 則對任一結點i 1 i n 有 1 如果i 1,則結點i無雙親,是二叉樹的根 如果i 1,則其雙親是結點。2 如果2i n,則結點i為葉子結點,無左孩子 否則,其左孩子...

堆排(大頂堆,小頂堆)

分類 資料結構 演算法相關 2009 10 15 12 26 2289人閱讀收藏 舉報汗,別人都說大小頂堆只是改改大於號的問題,可我的 從大頂堆只改動大於號調整為小頂堆竟然越界樂,掣肘!後來幾經更改才發現是傳參的問題 見 看來大頂堆改小頂堆不是 亦或是我rp出點問題?搞笑的是 磚頭 c b 竟然對越...

Java 堆排序 大頂堆 小頂堆

引用 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序的平均時間複雜度為 nlogn 演算法步驟 1.建立乙個堆h 0.n 1 2.把堆首 最大值 和堆尾互換 3....