L3 002 特殊堆疊

2021-09-13 22:02:27 字數 1494 閱讀 3566

堆疊是一種經典的後進先出的線性結構,相關的操作主要有「入棧」(在堆疊頂插入乙個元素)和「出棧」(將棧頂元素返回並從堆疊中刪除)。本題要求你實現另乙個附加的操作:「取中值」——即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n/2 小元;若是奇數,則為第 (n+1)/2 小元。

輸入的第一行是正整數 n(≤10​5​​)。隨後 n 行,每行給出一句指令,為以下 3 種之一:

push key

poppeekmedian

其中key是不超過 10​5​​ 的正整數;push表示「入棧」;pop表示「出棧」;peekmedian表示「取中值」。

對每個push操作,將key插入堆疊,無需輸出;對每個poppeekmedian操作,在一行中輸出相應的返回值。若操作非法,則對應輸出invalid

17

poppeekmedian

push 3

peekmedian

push 2

peekmedian

push 1

peekmedian

poppop

push 5

push 4

peekmedian

poppop

poppop

invalid

invalid32

2124

453invalid

入棧出棧都是o(1)的複雜度。接下來考慮取中位數,如果將棧裡的所有元素放到陣列,快速排序再輸出中位數,每次查詢o(nlogn)的複雜度,宗時間複雜度o(n*n*longn)就超時了。如果用nth_element();函式來找,每次查詢的複雜度o(n)

總時間複雜度o(n*n),也超時。

我們可以用線段樹或者樹狀陣列來做。線段樹每次查詢第k的數的複雜度是o(logn),樹狀陣列用sum(k)函式算1-k總共出現多少個,不能直接求第k大的數,但是sum()具有單調性,可以二分來算。這道題用線段樹複雜度比樹狀陣列低,樹狀陣列**量少。

#include#include #include#include using namespace std;

typedef long long ll;

const int maxn=1e5+5;

int n;

char c[10];

int bit[maxn];

stacks;

int cnt;

int sum(int x)

return ans;

}void add(int x,int i)

printf("%d\n",r);}}

return 0;

}

L3 002 特殊堆疊 (30 分)

堆疊是一種經典的後進先出的線性結構,相關的操作主要有 入棧 在堆疊頂插入乙個元素 和 出棧 將棧頂元素返回並從堆疊中刪除 本題要求你實現另乙個附加的操作 取中值 即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n 2 小元 若是奇數,則為第 n 1 2 小元。輸入...

L3 002 特殊堆疊 (30 分

堆疊是一種經典的後進先出的線性結構,相關的操作主要有 入棧 在堆疊頂插入乙個元素 和 出棧 將棧頂元素返回並從堆疊中刪除 本題要求你實現另乙個附加的操作 取中值 即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n 2 小元 若是奇數,則為第 n 1 2 小元。輸入...

L3 002 特殊堆疊 (30 分

l3 002 特殊堆疊 30 分 堆疊是一種經典的後進先出的線性結構,相關的操作主要有 入棧 在堆疊頂插入乙個元素 和 出棧 將棧頂元素返回並從堆疊中刪除 本題要求你實現另乙個附加的操作 取中值 即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n 2 小元 若是奇...