線段樹2 洛谷p3373 線段樹

2021-10-21 06:14:12 字數 1541 閱讀 3553

題目位址 解釋

多了乙個乘法操作,可以考慮優先順序。每次先算乘法。

首先,對於乙個區間(和為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個...