線段樹套平衡樹 BZOJ3196

2021-06-20 19:59:00 字數 2299 閱讀 5050

bzoj3196,tyvj1730.

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

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 output24

349線段樹套平衡樹,線段樹按位置建,平衡樹按值建。查詢區間排名為k的值是多少需要二分答案再去查詢有多少個比它小的數。

複雜度(nlog^2n+mlog^3n).

code:

// bzoj 3196

#include#include#include#define fo(i,a,b) for (int i = a;i <= b;i ++)

using namespace std;

const int maxn = 51000;

const int maxp = 2000000;

const int inf = 100000001;

int n,m,tot;

int a[maxn],root[maxn*4],l[maxp],r[maxp],size[maxp],k[maxp];

inline void l_rotate(int &t)

inline void r_rotate(int &t)

inline void maintain(int &t,bool flag)

else

maintain(l[t],0);

maintain(r[t],1);

maintain(t,0);

maintain(t,1);

}inline void insert(int &x,int val)

else }

inline int delete(int &t,int val)

if (val < k[t]) return delete(l[t],val);

else return delete(r[t],val);

}inline void maketree(int x,int l,int r)

inline int rank(int x,int v)

inline int getrank(int x,int l,int r,int ql,int qr,int v)

inline void modify(int x,int l,int r,int p,int v)

inline int pred(int x,int v)

}inline int getpred(int x,int l,int r,int ql,int qr,int v)

inline int succ(int x,int v)

}inline int getsucc(int x,int l,int r,int ql,int qr,int v)

void initialize()

void work()

else r = mid - 1;

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

} if (op == 3)

if (op == 4) printf("%d\n",getpred(1,1,n,x,y,z));

if (op == 5) printf("%d\n",getsucc(1,1,n,x,y,z)); }}

int main()

bzoj3196 二逼平衡樹 線段樹套平衡樹

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

BZOJ 3196 二逼平衡樹 樹套樹

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

BZOJ3196二逼平衡樹 樹套樹

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