P3834 模板 可持久化線段樹 1(主席樹)

2021-09-26 01:41:42 字數 1694 閱讀 4448

這是個非常經典的主席樹入門題——靜態區間第k小

資料已經過加強,請使用主席樹。同時請注意常數優化

如題,給定n個整數構成的序列,將對於指定的閉區間查詢其區間內的第k小值。

第一行包含兩個正整數n、m,分別表示序列的長度和查詢的個數。

第二行包含n個整數,表示這個序列各項的數字。

接下來m行每行包含三個整數l, r, kl,r,k , 表示查詢區間[l, r][l,r]內的第k小值。

輸出包含k行,每行1個整數,依次表示每一次查詢的結果

輸入 #1

5 5

25957 6405 15770 26287 26465

2 2 1

3 4 1

4 5 1

1 2 2

4 4 1

輸出 #1

6405

15770

26287

25957

26287

資料範圍

對於20%的資料滿足:1 \leq n, m \leq 101≤n,m≤10

對於50%的資料滿足:1 \leq n, m \leq 10^31≤n,m≤103

對於80%的資料滿足:1 \leq n, m \leq 10^51≤n,m≤105

對於100%的資料滿足:1 \leq n, m \leq 2\cdot 10^51≤n,m≤2⋅105

對於數列中的所有數a_iai​,均滿足-^9 \leq a_i \leq ^9−109≤ai​≤109

樣例資料說明

n=5,數列長度為5,數列從第一項開始依次為[25957, 6405, 15770, 26287, 26465 ][25957,6405,15770,26287,26465]

第一次查詢為[2, 2][2,2]區間內的第一小值,即為6405

第二次查詢為[3, 4][3,4]區間內的第一小值,即為15770

第三次查詢為[4, 5][4,5]區間內的第一小值,即為26287

第四次查詢為[1, 2][1,2]區間內的第二小值,即為25957

第五次查詢為[4, 4][4,4]區間內的第一小值,即為26287

解釋見**:

#includeusing namespace std;

const int maxn=2e5+6;

int a[maxn];//初始陣列

int b[maxn];//離散化陣列

int root[maxn];//定點編號

int cnt;

struct nodesz[maxn*20];//主席樹20倍空間

void updata(int l,int r,int &x,int y,int p)//&一定要加,因為每次遞迴都會更新

int getsum(int l,int r,int x,int y,int k)//在 x-y區間查詢第 k小

int main()

sort(b+1,b+1+n);//排序

int size=unique(b+1,b+1+n)-b-1;//去重,離散化

for(int i=1;i<=n;i++)

for(int i=1;i<=m;i++)

}

P3834 模板 可持久化線段樹 1(主席樹)

主席樹 菜雞看了乙個晚上的時間才懂。感覺網上的部落格大都大亂。我也是找到了幾遍好一點的看了一下。參考部落格 參考部落格 首先,會主席樹的前提是會線段樹。還有,我們一般在用線段樹的時候,下標位置大都是採用了i 2 和i 2 1來作為i號的左右孩子。但是,在主席樹中,我們不可以把這種思想帶過來。因為主席...

P3834 模板 可持久化線段樹 1(主席樹)

傳送門 板子,大佬的題解寫的真好 ps 看了看attack大佬的板子 跑的飛快 然後抄了抄 慢的要命 評測機玄學問題?真不知道大佬常數怎麼寫的 更神仙的是大佬居然都不先建樹直接加點 怎麼過的orz 1 luogu judger enable o22 minamoto 3 include4 defin...

P3834 模板 可持久化線段樹 1(主席樹)

這是個非常經典的主席樹入門題 靜態區間第k小 資料已經過加強,請使用主席樹。同時請注意常數優化 如題,給定n個正整數構成的序列,將對於指定的閉區間查詢其區間內的第k小值。輸入格式 第一行包含兩個正整數n m,分別表示序列的長度和查詢的個數。第二行包含n個正整數,表示這個序列各項的數字。接下來m行每行...