線段樹標記永久化 可持久化前提

2021-09-27 02:48:40 字數 2592 閱讀 5943

以這道例題為例:

p3372 【模板】線段樹 1

我們當然用線段樹來做這題。

不同於我們以前寫的標記下傳pushdown(),我們可以使用一種標記永久化的方法。

這種演算法的核心是:

乙個點的標記只增不減

拒絕使用pushup維護資訊

這樣的操作,在樹套樹、主席樹中很有用武之地。

我們如何完成這樣的神奇操作?

關於乙個點的標記只增不減,我們可以這樣做

關於拒絕使用pushup維護資訊,我們可以這樣做

#define usefasterread 1

#define rg register

#define inl inline

#define debug printf("qwq\n")

#define debugd(x) printf("var %s is %lld", #x, ll(x))

#define debugf(x) printf("var %s is %llf", #x, double(x))

#define putln putchar('\n')

#define putsp putchar(' ')

#define rep(a, s, t) for(rg int a = s; a <= t; a++)

#define repdown(a, t, s) for(rg int a = t; a >= s; a--)

typedef

long

long ll;

typedef

unsigned

long

long ull;

#include

#if usefasterread

char in[

1<<20]

,*ss = in,

*tt = in;

#define getchar() (ss == tt && (tt = (ss = in) + fread(in, 1, 1 << 20, stdin), ss == tt) ? eof : *ss++)

#endif

namespace io

inl ll read()

inl void

write

(ll x)

if(x >=10)

write

(x /10)

;putchar

(x %10+

'0');}

inl void

writeln

(ll x)

inl void

writesp

(ll x)

}using

namespace io;

template

<

typename t>

inline t max

(const t& x,

const t& y)

template

<

typename t>

inline t min

(const t& x,

const t& y)

template

<

typename t>

inline

void

swap

(t& x, t& y)

template

<

typename t>

inline t abs

(const t& x)

const

int maxn =

100005

;struct segment_tree

int m =

(l + r)

>>1;

build

(ls, l, m, a)

;build

(rs, m +

1, r, a)

; v[o]

= v[ls]

+ v[rs];}

intlen

(int o,

int x,

int y)

void

add(

int o,

int x,

int y, ll k)

int m =

(l[o]

+ r[o]

)>>1;

if(x <= m)

add(ls, x, y, k);if

(y > m)

add(rs, x, y, k);}

ll ask

(int o,

int x,

int y, ll tg)

#undef ls

#undef rs

}tr;

int n, m;

ll a[maxn]

;int

main()

else

}return0;

}

線段樹標記永久化

對於樹套樹,主席樹等使用到線段樹的比較複雜的資料結構,如果區間修改的話,打標記後pushdown或者pushup是很難做到的完全不行吧 所以這個時候,乙個神奇的東西誕生了。線段樹標記永久化,維護乙個標記,假設為cov,再維護乙個sum 假設修改區間 ql,qr 全部加上v 和平常一樣,到這個區間後c...

線段樹 標記永久化

一般線段樹做區間修改操作時,先是找到目標區間,然後修改該區間,並打下延遲標記,最後從目標區間自底向上,更新所有包含目標區間的區間的值 即pushup 當該區間子節點被訪問前,pushdown下推標記。這種維護區間的方式存在一點點弊端。例如用這種方式寫一棵可持久化線段樹,因為每次pushdown都相當...

可持久化線段樹總結(可持久化線段樹,線段樹)

最近正在學習一種資料結構 可持久化線段樹。看了網上的許多部落格,弄了幾道模板題,思路有點亂了,所以還是來總結整理下吧。你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一...