題目大意:在stack的原有功能上增加了peekmedian功能,即排好序後求中位數
push key
poppeekmedian
相應操作的值
演算法標籤:樹狀陣列
首先分析為什麼用樹狀陣列。顯然對於pop和push兩種操作無需考慮,在求中位數時候,為了得到中位數,顯然需要排序好的序列才能得到,如果每次都得排序,顯然時間複雜度會很高,如果是快排的話(o(nlgn)),最壞情況可能為(o(n2lgn))。所以關鍵問題在於查詢。假設tree[n]記錄0-n區間內節點個數,這樣查詢中位數的時候,只需要找到左右兩邊節點個數相同的那個值即為中位數,而tree[n]本來就是1-n有序的,所以自然不需要排序
// tsworld
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
100005
;int stack[n]
;int tree[n]
;inline
intlowbit
(int x)
void
change
(int index,
int delta)
}int
query
(int index)
return sum;
}int
find
(int value)
return l+1;
}int
main()
else
if(command ==
"pop"
)else
cout<<
"invalid\n";}
else
if(top%2==
0)ans =
find
(top/2)
;else
ans =
find
((top+1)
/2);
cout
}
PAT 甲級真題 1057 Stack
題目鏈結 題解 題目就是求第k小元素問題。由於操作次數比較多,因此直接排序輸出中間元素會超時,因此這題要用到第k小元素的經典做法之一,樹狀陣列。用樹狀陣列來維護現在棧內元素的資訊,然後使用二分查詢中間元素的值。這樣時間複雜度是o n logn o nlogn o nlog n 實現細節見 inclu...
PAT甲級1004樹的遍歷
個人覺得這題沒有1003南欸,就乙個樹的遍歷,把根找出來dfs就完事了,非常莫得技術含量,居然有30分,感覺有點點德不配位,題不配分哈哈哈哈哈哈 include include include include include include include include define inf 40...
PAT甲級 1020 樹的遍歷
用了乙個hash表方便後續的查詢工作。pos的作用是記錄中序遍歷中 的該值所在的陣列下標編號 int q n 模擬乙個佇列,用於輸出層序遍歷 intbuild int il,int ir,int pl,int pr void bfs int root 輸出個層序遍歷 int main int roo...