我們使用黑匣子的乙個簡單模型。它能存放乙個整數序列和乙個特別的變數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 43 1 -4 2 8 -1000 2
1 2 6 6
3312
剛開始並不知道這題該怎樣下手。知道是堆做了。
可是詳細也不知道怎麼做。
看了這第二個解題報告了才知道怎樣做:第二個解題報告,思想非常好)
#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....