題意:給出一段數列(1e6),讓你求[l,r]區間內第k小的數是多少(詢問次數5e3)
思路:不帶修改的主席樹
離散化是按照qsc的思路來寫的:
真實資料轉換成離散化後的下標即為1,2,3...
離散化後的下標要轉換成原來的數下標要減1
#include#include#includeusing namespace std;
const int maxn=1e5+6;
int n,m,cnt,root[maxn],a[maxn],x,y,k;
vectorv;
int getid(int x)
int main()
具體**:
#include#include#include#includeusing namespace std;
const int maxn=1e5+6;
int n,m,cnt,root[maxn],a[maxn],x,y,k;//cnt主席樹,a[maxn]代表每乙個數,x,y,k代表詢問
struct nodet[maxn*40];
vectorv;
int getid(int x)
void update(int l,int r,int &x,int y,int pos)
int query(int l,int r,int x,int y,int k)
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i],v.push_back(a[i]);
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i=1;i<=n;i++)
update(1,n,root[i],root[i-1],getid(a[i]));
for(int i=1;i<=m;i++){
cin>>x>>y>>k;
cout
more:
主席樹模板 POJ2104
離散化 對陣列排完序後用unique去重,unique返回的是去重後的陣列的末位址,減去第乙個元素的位址就能得到去重後的陣列大小,用lower bound查詢原數字在排序去重後的序列中的位序,用位序代替數字完成離散化。include include using namespace std defin...
主席樹模板(poj2104)
主席樹是可持久化線段樹,可以記錄線段樹的歷史版本。中和線段樹不同的是,l,r記錄的是左右子樹編號,因為普通的線段樹版本中,左右子樹自然就是o 1和o 1 1,但是主席樹中並不保證這個特性,所以需要記錄一下。是 include include include include include using...
Poj 2104 主席樹入門
題目 靜態查詢區間第 大 主席樹入門題目,之前看的很多資料一上來就是動態區間第 大,看得很費勁,後來找了個寫得清晰的,感覺靜態的還不算難,也不長 author cwind pragma comment linker,stack 102400000,102400000 include include ...