jzoj3379 查詢 主席樹

2021-09-25 03:53:04 字數 1150 閱讀 5586

給出乙個有序集合a

aa,定義al,

ra_

al,r

​表示集合內l∼r

l\sim r

l∼r這個範圍內的數。

定義加法a+b

a+ba+

b表示兩個集合中的所有元素(不去重)。

現在詢問,每次詢問ki,

pi

k_i,p_i

ki​,pi

​然後給出k

ik_i

ki​個區間[lj

,rj]

[l_j,r_j]

[lj​,r

j​]求∑j=

1kia

lj,r

j\sum_^ a_

j=1∑ki

​​al

j​,r

j​​這個集合中第p

ip_i

pi​小的數。

因為k ≤5

k\leq 5

k≤5所以我們可以考慮一般的主席樹求區間第k

kk小。

現在對於每個詢問的lj,

rj

l_j,r_j

lj​,rj

​我們讓k

kk組下標同時在主席數上跑動。那麼每次的數字個數即是k

kk組下標計算出來的數字的和。然後往左或往右區間走動是讓5

55組區間同時走動即可。

#include

#include

#define mn 201000

using

namespace std;

struct tnodet[mn<<5]

;int n,m,x,y,k,a[mn]

,b[mn]

,root[mn]

,q,w,r[6]

,l[6

],qnum,cnt;

intbuild

(int l,

int r)

intaddt

(int k,

int z)

intquery

(int k)

else

}int

main()

for(

int i=

1;i<=m;i++

)}

樹上主席樹 查詢樹鏈上第K大

給定一棵n個節點的樹,每個點有乙個權值,對於m個詢問 u,v,k 你需要回答u xor lastans和v這兩個節點間第k小的點權。其中lastans是上乙個詢問的答案,初始為0,即第乙個詢問的u是明文。第一行兩個整數n,m。第二行有n個整數,其中第i個整數表示點i的權值。後面n 1行每行兩個整數 ...

任務查詢系統(主席樹的差分性質)

思路 由於主席樹運用了字首和思想,每個位置儲存了所有權值的字首和 因此若此題的區間修改利用差分思想,則主席樹的每個位置恰好就維護的是自身位置 差分與字首和相互抵消了 也就是不必手動求字首和了。這樣我們就只需要離散化一下,然後利用差分思想處理所有的修改 而主席樹部分跟普通主席樹不同的是,主席樹的每個位...

主席樹,查詢區間的第k小值

學習報告 主席樹真的nb,如果樸素做要開n個線段樹,記憶體 優化的方式,每次插入乙個數,並不是整個權值線段樹都改變了,只是改變logn個節點,我們只需要多開logn個節點就ok,用root陣列記錄歷史個線段樹版本,詢問區間,可以做相減,詢問第k小值,與左樹的所有節點sum作比較,如果小就在左邊,否則...