PAT 甲級 1057 Stack 樹狀陣列

2021-10-10 04:00:00 字數 1137 閱讀 1244

題目大意:在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...