bzoj3196 Tyvj 1730 二逼平衡樹

2021-07-31 09:29:49 字數 2641 閱讀 9233

description

您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列,其中需要提供以下操作:

1.查詢k在區間內的排名

2.查詢區間內排名為k的值

3.修改某一位值上的數值

4.查詢k在區間內的前驅(前驅定義為小於x,且最大的數)

5.查詢k在區間內的後繼(後繼定義為大於x,且最小的數)

input

第一行兩個數 n,m 表示長度為n的有序序列和m個操作

第二行有n個數,表示有序序列

下面有m行,opt表示操作標號

若opt=1 則為操作1,之後有三個數l,r,k 表示查詢k在區間[l,r]的排名

若opt=2 則為操作2,之後有三個數l,r,k 表示查詢區間[l,r]內排名為k的數

若opt=3 則為操作3,之後有兩個數pos,k 表示將pos位置的數修改為k

若opt=4 則為操作4,之後有三個數l,r,k 表示查詢區間[l,r]內k的前驅

若opt=5 則為操作5,之後有三個數l,r,k 表示查詢區間[l,r]內k的後繼

output

對於操作1,2,4,5各輸出一行,表示查詢結果

sample input

9 6

4 2 2 1 9 4 0 1 1

2 1 4 3

3 4 10

2 1 4 3

1 2 5 9

4 3 9 5

5 2 8 5

sample output

2 4

3 4 9**

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

#define n 200001

#define m 3000001

int n,m,cnt,tmp,a[n];

intls[m],rs[m],rnd[m],v[m],size[m],w[m];

int root[n];

using namespace std;

inline int read()

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

return x*f;

}void update(int k)

void rturn(int &k)

void lturn(int &k)

void insert(int &k,int x)

size[k]++;

if (x==v[k]) w[k]++;

else

if (xls[k],x);if (rnd[ls[k]]else

if (ls[k]*rs[k]==0) k=ls[k]+rs[k];

else

if (rnd[ls[k]]else lturn(k),del(k,num);

}else

if (v[k]>num) del(ls[k],num),size[k]--;

else del(rs[k],num),size[k]--;

}void ask_rank(int k,int num)

else

if (numls[k],num);

else

}void get_rank(int k,int l,int r,int x,int y,int num)

int mid=(l+r)>>1;

if (y<=mid) get_rank(k<<1,l,mid,x,y,num);

else

if (x>mid) get_rank(k<<1|1,mid+1,r,x,y,num); else

}void get_index(int x,int y,int z)

else r=mid-1;

}printf("%d\n",ans);

}void change(int k,int l,int r,int x,int num,int y)

void after(int k,int num)

else after(rs[k],num);

}void ask_after(int k,int l,int r,int x,int y,int num)

int mid=(l+r)>>1;

if (y<=mid) ask_after(k<<1,l,mid,x,y,num);

else

if (x>mid) ask_after(k<<1|1,mid+1,r,x,y,num);

else

}void before(int k,int num)

else before(ls[k],num);

}void ask_before(int k,int l,int r,int x,int y,int num)

int mid=(l+r)>>1;

if (y<=mid) ask_before(k<<1,l,mid,x,y,num);

else

if (x>mid) ask_before(k<<1|1,mid+1,r,x,y,num);

else

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

int main()

}return

0;}

BZOJ3196 Tyvj 1730 二逼平衡樹

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

bzoj3196 Tyvj 1730 二逼平衡樹

傳送門 終於把這個大坑填完了。sb樹套樹 看似最不合理的方案恰恰是正確方案,樹套樹並不會mle,它的空間複雜度非常科學,o nlogn 結果因為空間算錯陣列開小神奇的t掉,浪費了我兩天時間 嘛。貌似除了操作二沒什麼好說的。轉換成判定性問題就好了,二分o nlog 3 n 解決。其他按照正常線段樹和平...

BZOJ 3196 TYVJ 1730 二逼平衡樹

k 在區間內的排名 2.查詢區間內排名為 k的值 3.修改某一位值上的數值 4.查詢 k 在區間內的前驅 前驅定義為小於 x,且最大的數 5.查詢 k 在區間內的後繼 後繼定義為大於 x,且最小的數 第一行兩個數n,m 表示長度為 n 的有序序列和 m個操作 第二行有 n 個數,表示有序序列 下面有...