洛谷P3373 線段樹2 乘法加法模板線段樹

2021-09-25 16:11:29 字數 1599 閱讀 7293

這個模板題可真是有點意思。。。

重點在lazytag上,加上乘法操作的tag。

update乘的時候要把加的標記也乘一下!

下放標記的時候也要記得先乘後加!

#include

#include

#define maxn 1000001

#define ll long long

using

namespace std;

unsigned ll n,m,p,a[maxn]

,ans[maxn<<2]

,tag[maxn<<2]

,tag2[maxn<<2]

;inline ll ls

(ll x)

inline ll rs

(ll x)

void

scan()

inline

void

push_up

(ll p)

void

build

(ll p,ll l,ll r)

ll mid=

(l+r)

>>1;

build(ls

(p),l,mid)

;build(rs

(p),mid+

1,r)

;push_up

(p);

}inline

void

push_down

(ll p,ll l,ll r)

inline

void

update2

(ll nl,ll nr,ll l,ll r,ll p,ll k)

push_down

(p,l,r)

; ll mid=

(l+r)

>>1;

if(nl<=mid)

update2

(nl,nr,l,mid,

ls(p)

,k);

if(nr>mid)

update2

(nl,nr,mid+

1,r,

rs(p)

,k);

push_up

(p);

}inline

void

update

(ll nl,ll nr,ll l,ll r,ll p,ll k)

push_down

(p,l,r)

; ll mid=

(l+r)

>>1;

if(nl<=mid)

update

(nl,nr,l,mid,

ls(p)

,k);

if(nr>mid)

update

(nl,nr,mid+

1,r,

rs(p)

,k);

push_up

(p);

}ll query

(ll q_x,ll q_y,ll l,ll r,ll p)

intmain()

case2:

case3:

}}return0;

}

洛谷 P3373 線段樹 2

作為一道調了三天的模板題,真的太虐心了對於理解線段樹大有用處。傳送門如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空...

線段樹2 洛谷p3373 線段樹

題目位址 解釋 多了乙個乘法操作,可以考慮優先順序。每次先算乘法。首先,對於乙個區間 和為s 假設已經按 a 乘b進行了操作。值得到的值為 s a b sb ab 假設先乘得到 sb a 這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...

洛谷P3373 模板 線段樹2

這題有毒啊,敲了我一晚上加一早上,總算a了。由於有加和乘兩個操作,要用2個lazy陣列。核心難點就是2個lazy陣列會相互影響。因為乘影響加,加不影響乘,所以我們先算乘。include include include include include include include include i...