時間限制: 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,而且要求他的橫座標盡量小,如果有多個點滿足,則選取橫座標盡量小的前提下,縱座標最小的點。方法 將...