給出乙個有序集合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作比較,如果小就在左邊,否則...