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 個數,表示有序序列 下面有...