BZOJ 3196 二逼平衡樹 樹套樹

2021-08-03 21:26:01 字數 2704 閱讀 6897

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 64 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

2hint

1.n和m的資料範圍:n,m<=50000

2.序列中每個數的資料範圍:[0,1e8]

3.雖然原題沒有,但事實上5操作的k可能為負數

解法:樹套樹sb題

//二逼平衡樹

#include

using

namespace

std;

const

int maxn = 200010;

const

int maxm = 3000010;

const

int inf = 1e8;

int n, m, sz, tmp, a[maxn];

int ls[maxm], rs[maxm], rnd[maxm], v[maxm], s[maxm], w[maxm];

int root[maxn];

void update(int k)

void rturn(int &k)

void lturn(int &k)

void insert(int &k, int x)

s[k]++;

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

else

if(x>v[k])

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

else

if(rnd[ls[k]]else

}else

if(x>v[k])

else

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

void query_rank(int k, int x)

else

if(x>v[k])

else

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

int mid=(l+r)/2;

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

else

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

else

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

else

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

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

void query_pro(int k, int x)

void query_sub(int k, int x)

else query_sub(rs[k],x);

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

int mid=(l+r)/2;

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

else

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

else

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

int mid=(l+r)/2;

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

else

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

else

}int main()

else

if(op == 2)

else

if(op == 3)

else

if(op == 4)

else

}return0;}

BZOJ3196二逼平衡樹 樹套樹

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

樹套樹 BZOJ3196 二逼平衡樹

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

Bzoj3196 二逼平衡樹

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