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,且最小的數 額,這個題,看了一眼就知道是...