題目位址 解釋
多了乙個乘法操作,可以考慮優先順序。每次先算乘法。
首先,對於乙個區間(和為s) 假設已經按 +a , 乘b進行了操作。值得到的值為( (s + a) * b )-> sb + ab 假設先乘得到(sb + a )這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,
為了進行先乘的操作而不讓結果發生變化,應該將add乘上當前乘的值。這個就是update裡面更新乘法時候應該進行的操作。
push_down也是這樣更新子區間的add,mul直接乘上。
初始狀態mul為1,add為0。
#include
#include
using
namespace std;
const
int n =
1e5+10;
typedef
long
long ll;
#define l(x) t[x].l
#define r(x) t[x].r
#define add(x) t[x].add
#define mul(x) t[x].mul
#define sum(x) t[x].sum
int n,m,mod;
int a[n]
;struct segmenttreet[n*4]
;void
push_up
(int p)
void
push_down
(int p)
void
build
(int p,
int l,
int r)
int mid =
(l + r)
>>1;
build
(p*2
,l,mid)
;build
(p*2+1
,mid+
1,r)
;push_up
(p);
}void
update
(int p,
int l,
int r,
int v,
int id)
else
return;}
push_down
(p);
int mid =(l
(p)+
r(p)
)>>1;
if(l <= mid)
update
(p*2
,l,r,v,id);if
(r > mid)
update
(p*2+1
,l,r,v,id)
;push_up
(p);
}ll ask
(int p,
int l,
int r)
intmain()
else
if(t ==2)
else
}return0;
}
洛谷 P3373 線段樹 2
作為一道調了三天的模板題,真的太虐心了對於理解線段樹大有用處。傳送門如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空...
洛谷P3373 模板 線段樹2
這題有毒啊,敲了我一晚上加一早上,總算a了。由於有加和乘兩個操作,要用2個lazy陣列。核心難點就是2個lazy陣列會相互影響。因為乘影響加,加不影響乘,所以我們先算乘。include include include include include include include include i...
洛谷 P3373 模板 線段樹 2
如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個...