Poj 2104 主席樹入門

2022-05-12 18:38:43 字數 1436 閱讀 9044

題目:靜態查詢區間第k大.

主席樹入門題目,之前看的很多資料一上來就是動態區間第k大,看得很費勁,後來找了個寫得清晰的,感覺靜態的還不算難,**也不長.

/*

* @author: cwind

*///

#pragma comment(linker, "/stack:102400000,102400000")

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ios std::ios::sync_with_stdio (false);std::cin.tie(0)

#define pb push_back

#define pb pop_back

#define bk back()

#define fs first

#define se second

#define sq(x) (x)*(x)

#define eps (1e-6)

#define iinf (1<<29)

#define linf (1ll<<59)

#define inf (1000000000)

#define finf (1e3)

#define clr(x) memset((x),0,sizeof (x));typedef

long

long

ll;typedef unsigned

long

long

ull;

typedef pair

pii;

typedef pair

p;const

int maxn=3e6;

const

int maxlen=1e5+300

;struct

node

}t[maxn];

int sz=0

;int

d[maxlen],a[maxlen];

void insert(int &n,int l,int r,int

x)int query(int i,int j,int l,int r,int

k)int

n,m;

introot[maxlen];

intmain()

sort(d,d+n);

for(int i=0;i)

while(m--)

return0;

}

view code

主席樹入門 模板 POJ 2104

查詢區間第k大,而且沒有修改。主席樹的原理就是在現有的一顆線段樹上不斷加入新的節點,而加入的對於現有線段樹的影響另開一條鏈記錄下來,這樣我們就可以儲存線段樹的歷史版本,在查詢時只需要把區間減一下就可以了。include include include using namespace std cons...

主席樹模板 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...