主席樹經典問題,靜態查詢區間第k大數。
拖了很久都沒有寫的模板。。。。結果差不多此次%你賽都考,痛定思痛後,決定好好研究下。
主席樹可以近似理解為權值線段樹的字首和的形式,詳細講解可參考wcr寫的主席樹講解:傳送門。
回到該題,因為不涉及修改操作,所以我們建立n棵權值線段樹,先將資料離散化,這樣主席樹的權值就在1~len中了,每次插入操作就相當於將a[i]到根的路徑上所有節點的sun+1,由於只會影響一條鏈,所以乙個節點最多隻會有乙個兒子發生變化,所以建圖大概是這樣的:
如上圖,如果a[i]為4,那麼1~4這條路徑上所有節點sum+1,發現1號節點的左兒子其實與新節點左兒子一樣,所以直接先將1號節點資訊賦給新節點,再遞迴修改右兒子。
查詢時,因為所有權值線段樹的值域相同,所以可以進行減法這種操作,具體實現參照**。
#includeusing namespace std;
const int maxn=2e5+10;
int n,q,cnt;
int a[maxn],ls[maxn],rt[maxn];
struct treetr[maxn*50];
int read()
void insert(int x,int &root,int l,int r,int key)
int query(int root1,int root2,int l,int r,int k)
int main()
return 0;
}
洛谷3834 可持久化線段樹(主席樹模板)
主席樹經典問題,靜態查詢區間第k大數。拖了很久都沒有寫的模板。結果差不多此次 你賽都考,痛定思痛後,決定好好研究下。主席樹可以近似理解為權值線段樹的字首和的形式,詳細講解可參考wcr寫的主席樹講解 傳送門。回到該題,因為不涉及修改操作,所以我們建立n棵權值線段樹,先將資料離散化,這樣主席樹的權值就在...
洛谷 P3834 可持久化線段樹 2(主席樹)
因為太菜了,所以也不知道這題的演算法到底應該叫做什麼,看hzw部落格中把這題歸到主席樹了,那我也歸到主席樹里吧。其實我連主席樹定義都不知道 include using namespace std const int n 2e5 5 int n,q,m,x,y,t,cnt int a n b n ll...
洛谷P3834 可持久化線段樹 主席樹 模板
題目 無法忍受了,我要寫主席樹!解決區間第 k 大查詢問題,可以用主席樹,像字首和一樣建立 n 棵字首區間的權值線段樹 然後 n 棵線段樹可以共用一些節點 線段樹的 sum 可以相減,利用這個查詢即可 什麼嘛,主席樹也沒我想得那麼難 蠻簡單的 如下 include include include i...