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