//主席樹 權值線段樹+可持久化
//權值線段樹:在此處指各個數字在某個區間內出現的次數
//那麼第一棵權值線段樹會記錄[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 就是本次的標題...