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
51 421 32
1 5
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 線性...