以這道例題為例:
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,即為生成乙個完全一...