L3 002 特殊堆疊 30分 (兩種方法)

2021-10-10 13:11:39 字數 2723 閱讀 2918

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

輸入格式:

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

push key

poppeekmedian

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

輸出格式:

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

輸入樣例:

17

poppeekmedian

push 3

peekmedian

push 2

peekmedian

push 1

peekmedian

poppop

push 5

push 4

peekmedian

poppop

poppop

輸出樣例:

invalid

invalid32

2124

453invalid

我居然有勇氣挑戰l3的題。。。

這道題的難點在於取中值,我首先想的就是放到乙個vector陣列中,直接取,要求是第幾小元,顯然要排序,sort一把,**寫的很快,但在提交前,我就已經意識到肯定會超時。。(10^5的邊界),果然,後邊嘗試了其他方法,以失敗告終。乙個博主用的lower_bound函式(這個我用的不多,平時也想不起來),而且它直接找到了插入的位置,這直接就做到了有序,我不太了解底層的原始碼,所以就照著用它的方法在我的基礎上改了改(當然咱還是能看懂他是怎麼做的),提交25分,嗯?超時,換換scanf和printf,順便用用它說的很快的char陣列,30分,yeah,過了。撤銷,又提交了一遍25分的**,嗯?這次又過了,啊這,就很迷

參考鏈結

完全自己寫的,17分,其餘測試點(測試點1 2 3)超時

#include

#include

#include

using

namespace std;

intmain()

else

if(s==

"peekmedian")}

else

if(s==

"pop")}

else

}return0;

}

25分直接變30分,只因多提交了一次?

#include

#include

#include

using

namespace std;

intmain()

else

if(s[1]

=='e')}

else}}

return0;

}

參考其他博主**普通c++版

#include

#include

#include

using

namespace std;

intmain()

else

if(s[1]

=='e')}

else}}

return0;

}

參考演算法筆記,分治法

#include

#include

using

namespace std;

const

int maxn =

100010

;const

int sqrtn =

316;

// int(sqrt(100010)),表示塊內元素個數

int block[sqrtn]

;//記錄每一塊中存在的元素個數

int table[maxn]

;// hash陣列,記錄元素當前存在個數

stack<

int> st;

void

peekmedian

(int k)

int num = idx * sqrtn;

// idx號塊的第乙個數

while

(sum + table[num]

< k)

printf

("%d\n"

, num);}

void

push

(int x)

void

pop(

)int

main()

else

if(opt[1]

=='o'

)else

}else

else}}

return0;

}

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 小元 若是奇...