splay入門題 中位數

2021-07-15 10:46:50 字數 1112 閱讀 8407

mid

description

維護乙個集合,有2種操作:

1.每次可以插入乙個元素。

2.找出當前集合中第[n+1/2]大的元素,把它輸出,然後把它從集合中刪除。

n<=100000

input

第1行乙個數n,表示由n次操作。接下來n行。每行第1個數c表示操作型別。

1.c=1,接下來還有乙個數,表示要插入元素。

2.c=2,表示要進行第2種操作。

output

一共m行。按順序對應輸入中的第2種情況。

sample input

5

1 32

1 5

1 42

sample output3

5 此題為splay入門題,動態維護求中位數,單點插入和刪除,動態查詢。

刪除我用的是找前驅來覆蓋值,同時用-inf來作為樹中一定存在的點,防止刪除和插入出錯。教訓:splay在插入後一定要splay來保證樹的深度不會退化到o(n)。

#include#define maxn 100500

using namespace std;

int son[maxn][2],val[maxn],op[maxn],fa[maxn],size[maxn];

int n,m,root,tot;

void update(int x)

void rotate(int x)

void splay(int x)

root=x;

}int find_rank(int x,int y)

int find_pre(int x)

void splay_delete(int x)

fa[y]=0; op[y]=0; son[y][0]=0; size[y]=0;

y=z;

while (y!=x)

size[x]--;

}void splay_insert(int x){

int xx=root;

int opp=val[xx]

演算法題 中位數問題

平時我們要找中位數還得排一下序,但是如果掌握了堆這乙個結構。我們就只需要乙個大頂堆和乙個小頂堆就可以了。大頂堆和小頂堆的性質不贅述,但是乙個比較重要的提一下,就是大頂堆堆頂是整個堆的最大值,小頂堆的頂必然是最小值。並且我們要實現的中位數的演算法,還需要保證小頂堆的最小值大於大頂堆的最大值。1 有了這...

Vijos 1549題 中位數

給出1 n的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是b。中位數是指把所有元素從小到大排列後,位於中間的數。輸入格式 第一行為兩個正整數n和b 第二行為1 n 的排列。輸出格式 輸出乙個整數,即中位數為b的連續子串行個數。樣例輸入1 5 4 1 2 3 4 5樣例輸出1 2樣例輸入...

中位數的中位數

參照王曉東的演算法設計 中位數的中位數,即將一串數分成n段,求其排好序了的中間那個數,再把這些所有中位數再求一次中位數。for int i 0 i r p 4 5 i 找中位數的中位數,r p 4即上面所說的n 5 int x lineselect a,p,p r p 4 5,r p 4 10 線性...