L3 002 特殊堆疊 樹狀陣列 二分

2021-10-22 18:39:13 字數 1848 閱讀 9692

原題鏈結

堆疊是一種經典的後進先出的線性結構,相關的操作主要有「入棧」(在堆疊頂插入乙個元素)和「出棧」(將棧頂元素返回並從堆疊中刪除)。本題要求你實現另乙個附加的操作:「取中值」——即返回所有堆疊中元素鍵值的中值。給定 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

題解

注意如果取中間數要是開乙個陣列的話時間複雜度o(n2),資料集大小1e5,會超時,所以需要用到樹狀陣列+二分

#include

#define x first

#define y second

#define send string::nops

using

namespace std;

typedef

long

long ll;

const

int n =

1e5+10;

const

int m =

3* n;

const

int v =

1e2+10;

const

int inf =

0x3f3f3f3f

;typedef pair<

int,

int> pii;

typedef

struct node * pnode;

int tree[n]

;int n,m;

string line;

stack<

int>s;

intlowbit

(int x)

intquery

(int x)

return res;

}void

add(

int u,

int x)

}int

sum(

int x,

int y)

bool

check

(int mid)

intmain()

}else

if(line ==

"peekmedian"

) cout<< l

if(line ==

"push")}

return0;

}

L3 002 堆疊 樹狀陣列 二分

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 大家都知道 堆疊 是一種 先進後出 的線性結構,基本操作有 入棧 將新元素插入棧頂 和 出棧 將棧頂元素的值返回並從堆疊中將其刪除 現請你實現一種特殊的堆疊,它多了一種操作叫 查中值...

L3 002 特殊堆疊

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

天梯賽L3 002 特殊堆疊(陣列模擬 二分)

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