線段樹 平衡樹(STL) 勤快的love 楓

2022-03-27 07:51:58 字數 2282 閱讀 2753

時間限制: 1 sec  記憶體限制: 128 mb

小絕戀love 楓是乙個出納,經常需要做一些統計報表的工作。今天是絕戀love 楓的生日,小絕戀love 楓希望可以幫爸爸分擔一些工作,作為他的生日禮物之一。經過仔細觀察,小絕戀love 楓發現統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢操作。在最開始的時候,有乙個長度為n 的整數序列,並且有以下三種操作:insert i k 在原數列的第i 個元素後面新增乙個新元素k;如果原數列的第i 個元素已經新增了若干元素,則新增在這些元素的最後(見下面的例子)

min_gap 查詢相鄰兩個元素的之間差值(絕對值)的最小值

min_sort_gap 查詢所有元素中最接近的兩個元素的差值(絕對值)

例如一開始的序列為

5 3 1

執行操作insert 2 9 將得到:

5 3 9 1

此時min_gap 為2,min_sort_gap 為2。

再執行操作insert 2 6 將得到:

5 3 9 6 1

注意這個時候原序列的第2 個元素後面已經新增了乙個9,此時新增的6 應加在9 的後面。這個時候min_gap 為2,min_sort_gap 為1。於是小絕戀love 楓寫了乙個程式,使得程式可以自動完成這些操作,但是他發現對於一些大的報表他的程式執行得很慢,你能幫助他改進程式麼?

第一行包含兩個整數n,m,分別表示原數列的長度以及操作的次數。

第二行為n 個整數,為初始序列。

接下來的m 行每行乙個操作,即「insert i k」,「min_gap」,「min_sort_gap」中的一種(無

多餘空格或者空行)。

對於每乙個「min_gap」和「min_sort_gap」命令,輸出一行答案即可。

3 55 3 1insert 2 9min_sort_gapinsert 2 6min_gapmin_sort_gap
221
對於30% 的資料,n≤1000,m≤5000

對於100% 的資料,n,m≤50000

對於所有的資料,序列內的整數不超過5*108。

第二問,明顯用平衡樹,set+指標強行亂搞即可。

#include#include#include#include#include#include#define inf 100000000

#includeusing namespace std;

multisetst;

int n,m,fri[50005],last[50005],id[100005],cnt,min1=inf;

struct tree

a[400005];

inline int read()

while(x>='0'&&x<='9')

return sum*f;

}void build(int l,int r,int x)

int mid=(l+r)/2;

build(l,mid,x*2);

build(mid+1,r,x*2+1);

a[x].h=min(a[x*2].h,a[x*2+1].h);

}void change(int h,int k,int x)

int mid=(a[x].l+a[x].r)/2;

if(h<=mid)

change(h,k,x*2);

else

change(h,k,x*2+1);

a[x].h=min(a[x*2].h,a[x*2+1].h);

}/*int q(int l,int r,int x)

*/int main()

for(int i=1;i::iterator it=st.find(fri[i]),it2=it;

if(it!=st.begin())

if(it2!=st.end())

temp=min(temp,temp2);

min1=min(min1,temp);

}char p[20];

while(m--)

else

int temp=inf,temp2=inf;

multiset::iterator it=st.find(y),it2=it;

if(it!=st.begin())

if(it2!=st.end())

temp=min(temp,temp2);

min1=min(min1,temp);

}if(p[4]=='g')printf("%d\n",a[1].h);

if(p[4]=='s')printf("%d\n",min1);

}}

二逼平衡樹 樹套樹(線段樹套Splay平衡樹)

題面 bzoj3196 解析線段樹和splay兩棵樹套在一起,常數直逼inf,但最終僥倖過了 思路還是比較簡單,在原陣列維護乙個下標線段樹,再在每乙個線段樹節點,維護乙個對應區間的權值splay。簡單說一下操作 0.提取區間 1.查詢區間內k的排名 提取區間,找到區間內所有的splay,分別比k小的...

線段樹套平衡樹 BZOJ3196

bzoj3196,tyvj1730.題目 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x...

CF 19D Points 線段樹 平衡樹

在平面上進行三種操作 1 add x y 在平面上新增乙個點 x,y 2 remove x y 將平面上的點 x,y 刪除 3 find x y 在平面上尋找乙個點,使這個點的橫座標大於x,縱座標大於y,而且要求他的橫座標盡量小,如果有多個點滿足,則選取橫座標盡量小的前提下,縱座標最小的點。方法 將...