這個模板題可真是有點意思。。。
重點在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...