主席樹 區間第k小

2022-03-30 07:06:19 字數 1199 閱讀 2620

//

主席樹 權值線段樹+可持久化

//權值線段樹:在此處指各個數字在某個區間內出現的次數

//那麼第一棵權值線段樹會記錄[1,1]的數字出現次數

//第n棵權值線段樹會記錄[1,n]的數字出現次數

//例:數列為110001

//第一棵權值線段樹記錄為tree1[0]=0 tree1[1]=1

//第二棵權值線段樹記錄為tree2[0]=0 tree2[1]=2

//第六棵權值線段樹記錄為tree6[0]=3 tree6[1]=3

//那麼要求區間為[3,5]的數字出現次數可拿第五棵權值線段樹減去第(三減一)棵權值線段樹

//此處運用字首和思想

//將多棵權值線段樹的公共點合為乙個點可減少空間複雜度

//求區間第k小即可求出區間數字出現次數後遞迴操作

#include#include

#include

#include

#include

#include

using

namespace

std;

int n,m,cnt,b[200001],root[200001];//

b離散化後的值 root根的編號

struct

uioa[

200001];//

離散化輔助結構體

struct

rtytree[5000001];//

權值線段樹 遞增使得左兒子表示的值小於右兒子表示的值

bool

cmp(uio x,uio y)

void update(int l,int r,int k,int &now)//

新建節點的左右兒子,新建節點值,當前節點

int query(int l,int r,int x,int y,int k)//

左右兒子,兩棵權值線段樹編號,第k大

void

do_something()

}int

main()

sort(a+1,a+1+n,cmp);

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

b[a[i].id]=i;//

離散化

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

do_something();

return0;

}

主席樹(區間第k小)

k th number 求區間內第k小的數。主席樹的板子題 主席樹左子樹存小值,右邊大值,用sum記錄一下子樹節點個數。對 l,r 的查詢區間,root r root l 1 可得出 l,r 的差值,也就是大小的個數 include include include include include i...

主席樹 靜態區間第k小

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

主席樹 動態區間第k小

模板題在這裡洛谷2617。閱讀本文需要有主席樹的基礎,也就是通過區間kth的模板題。靜態整體kth sort一下找第k小,時間複雜度 o nlogn 動態整體kth 權值線段樹維護一下,時間複雜度 o nlogn 靜態區間kth 主席樹維護,時間複雜度 o nlogn 動態區間kth 就是本次的標題...