線段樹懶標記

2022-05-30 18:24:09 字數 2922 閱讀 9428

線段樹在n較小、操作較多的情況下效率很高。雖然如此,如果直接暴力進行修改的話還是會tle得很慘。於是乙個叫做懶標記的東西應運而生。

懶標記

why優秀:在修改乙個節點時,若此點已經被懶標記所標記,我們就將此點懶標記取消,標記左右子節點傳遞下去,當被更新或者被查詢時再更新節點,節約了根本不會被用到的花費。這也是線段樹作為「樹」優秀的地方。

開始學習

洛谷已經為我們排好了對線段樹的逐層深度學習xd

1 #include2 #include3

using

namespace

std;

4const

int maxn=1e5,maxm=1e5;

5 typedef long

long

ll;6

void read(int &x)714

}15int a[maxn*10

];16

struct

nodee[maxn*6

];19

intn,m,k;

20 inline ll ls(ll ro)

21 inline ll rs(ll ro)

22 inline void

push_up(ll ro)

2326 inline void

push_down(ll ro)

2734

35void

build(ll ro,ll l,ll r)

3643 e[ro].tag=0

;44 ll mid=(l+r)>>1;45

build(ls(ro),l,mid);

46 build(rs(ro),mid+1

,r);

47push_up(ro);48}

4950

void

update(ll ro,ll l,ll r)

5158

push_down(ro);

59 ll mid=(e[ro].l+e[ro].r)>>1;60

if(l<=mid)update(ls(ro),l,r);

61if(r>mid)update(rs(ro),l,r);

62push_up(ro); 63}

6465

ll check(ll ro,ll l,ll r)

6675

signed main()

7692

case(2

):97}98

}99return0;

100 }

1 #include2 #include3

using

namespace

std;

4const

int maxn=1e5;

5 typedef long

long

ll;6

intn,m,p,a[maxn],k;

7struct

treee[maxn*4

];10 inline void read(int &x)

11 //

這個快讀讀不了負數 xd

17 inline ll ls(int ro)

18 inline ll rs(int ro)

1920 inline void

lazy_add(ll ro)

2126

27 inline void

lazy_tag(ll ro)

2833

34 inline void

push_down(ll ro)

3543

44 inline void

push_up(ll ro)

4548

49void

build(ll ro,ll l ,ll r)

50//

賦值 54

int mid=(l+r)>>1;55

build(ls(ro),l,mid);

56 build(rs(ro),mid+1

,r);

57push_up(ro);

58 e[ro].val%=p;//

膜一下 59}

6061

//更新乘

62void

update_tag(ll ro,ll l ,ll r)

6371

push_down(ro);

72int mid=(e[ro].l+e[ro].r)>>1;73

if(l<=mid)update_tag(ls(ro),l,r);

74if(r>mid)update_tag(rs(ro),l,r);

75push_up(ro);76}

7778

//更新和

79void

update_add(ll ro,ll l,ll r)

8087

push_down(ro);

88int mid=(e[ro].l+e[ro].r)>>1;89

if(l<=mid)update_add(ls(ro),l,r);

90if(r>mid)update_add(rs(ro),l,r);

91push_up(ro);92}

9394

ll query(ll ro,ll l,ll r)

95105

intmain()

106121

case(2

):126

case(3

):131

}132

}133

return0;

134 }

我不會xd

有待更新

(其實和2一樣就是複雜一點)

poj 3468 線段樹 懶標記

簡單的線段樹區間求和問題,每次改變區間值得時候採用懶標記的操作,等到下次經過這個區間的時候再將懶標記向下傳遞。include include using namespace std int n,q int a 100005 long long sum 500005 lazy 500005 void ...

線段樹懶標記好題 HDU4578

1 1 x y c 代表 把區間 x,y 上的值全部加c 2 2 x y c 代表 把區間 x,y 上的值全部乘以c 3 3 x y c 代表 把區間 x,y 上的值全部賦值為c 4 4 x y p 代表 求區間 x,y 上值的p次方和1 p 3 維護sum1,sum2,sum3分別為一次方 二次方...

字首查詢(字典樹 線段樹懶惰標記)

描述 在乙個 minecraft 村莊中,村長有這一本小寫字母構成的名冊 字串的表 每個名字旁邊都記錄著這位村民的聲望值,而且有的村民還和別人同名。隨著時間的推移,因為沒有村民死亡,這個名冊變得十分大。現在需要您來幫忙維護這個名冊,支援下列 4 種操作 1.插入新人名 si,聲望為 ai 2.給定名...