poj2104 主席樹 離散化

2021-08-28 04:23:59 字數 1036 閱讀 6418

題意:給出一段數列(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 ...