線段樹 L3 002 堆疊

2021-07-14 18:08:22 字數 1498 閱讀 7653

大家都知道「堆疊」是一種「先進後出」的線性結構,基本操作有「入棧」(將新元素插入棧頂)和「出棧」(將棧頂元素的值返回並從堆疊中將其刪除)。現請你實現一種特殊的堆疊,它多了一種操作叫「查中值」,即返回堆疊中所有元素的中值。對於n個元素,若n是偶數,則中值定義為第n/2個最小元;若n是奇數,則中值定義為第(n+1)/2個最小元。

輸入格式:

輸入第一行給出正整數n(<= 105

)。隨後n行,每行給出乙個操作指令,為下列3種指令之一:

push

keypop

peekmedian

其中push表示入棧,key是不超過105

的正整數;pop表示出棧;peekmedian表示查中值。

輸出格式:

對每個入棧指令,將key入棧,並不輸出任何資訊。對每個出棧或查中值的指令,在一行中列印相應的返回結果。若指令非法,就列印「invalid」。

輸入樣例:

17

poppeekmedian

push 3

peekmedian

push 2

peekmedian

push 1

peekmedian

poppop

push 5

push 4

peekmedian

poppop

poppop

輸出樣例:
invalid

invalid32

2124

453invalid

#include#include#include#include#include#includeusing namespace std;

queueq;

stacks;

int n,node[100005*4],p;

void update(int l,int r,int n,int p,int flag)

int mid=l+(r-l)/2;

if(p<=mid)

update(l,mid,2*n,p,flag);

else

update(mid+1,r,2*n+1,p,flag);

node[n]=node[n*2]+node[n*2+1];

}void find(int l,int r,int n,int p)

int m=l+(r-l)/2;

if(node[n*2]>=p)

find(l,m,2*n,p);

else

find(m+1,r,n*2+1,p-node[n*2]);

}int main()

}else if(str[1]=='u')

else if(str[1]=='e')

else

printf("invalid\n");}}

return 0;

}

L3 002 特殊堆疊

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

L3 002 堆疊 樹狀陣列 二分

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

L3 002 特殊堆疊 (雙陣列模擬棧)

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