hdu2665 主席樹(可持久化線段樹)

2022-03-15 23:36:43 字數 1116 閱讀 2285

題意:給定乙個陣列,每次查詢第l到r區間的第k大值

經過這題總算對可持久化線段樹有了些了解,我們開始先建一顆空樹,然後對於每次修改我們只會修改logn個點,我們可以新建logn個來避免每次都新建一顆線段樹導致的爆空間,

對於這題來說我們線段樹中維護的是這個區間的點的個數,插入的時候按權值大小插入,對於l到r我們可以通過1-r減去1-(l-1)來求出l到r的,對於第k大我們可以用求平衡樹第k大的做法,每次查詢節點個數看往左走還是往右走

#include#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define pi acos(-1.0)

#define ll long long

#define mod 1000000007

#define c 0.5772156649

//#define ls l,m,rt<<1

//#define rs m+1,r,rt<<1|1

#define pii pairusing

namespace

std;

const

double g=10.0,eps=1e-12

;const

int n=100000+10,maxn=200000+10,inf=0x3f3f3f3f

;int a[n],b[n],tot,rt[n*20],ls[n*20],rs[n*20],sum[n*20

];void build(int &o,int l,int

r)void update(int &o,int l,int r,int last,int

p)int query(int ss,int tt,int l,int r,int

x)void work(int

sz)void

debug()

intmain()

return0;

}/********************

14 2

4 1 3 2

2 3 2

*******************

*/

view code

hdu2665(主席樹模板題)

求區間第 k 小。參考這類題目做法挺多的,例如 劃分樹。這裡使用主席樹再寫一發,不得不說主席樹相比而言要好寫的多,比起普通線段樹,主席樹就是復用了線段樹共有的資訊。可持久化資料結構講究的就是復用共有的資訊,可持久化 trie 的思想也是差不多的。includeusing namespace std ...

hdu2665 主席樹模板題

題目 區間k大值,區間極值很容易想到線段樹,如果k是個位數的話,可以考慮開k個域的線段樹 滾 又稱可持久化線段樹,函式式線段樹 也許是上面兩個字看的太長,同時主席兩字給人一種不明覺厲的感覺,so,嘿嘿嘿 關於主席樹的講解可以看這 先離散化,對每個點i,建乙個1 i的線段樹 大小是數字的個數 記錄該字...

hdu2665 可持續化線段樹

a的第一道可持續化線段樹。我是看這個看懂的 可持續化線段樹,主要思想就是利用歷史資訊,減少時間和記憶體花銷。比方有兩棵線段樹,但是他們只有乙個節點資訊不同。仔細一想,在這兩顆線段樹上,對應的 l,r 節點 只有log n 個節點不同。那麼,除了不同的節點,其他節點資訊,他們完全可以共用。關於這題解法...