P3373 模板 線段樹 2(區間增乘)

2022-05-26 19:24:08 字數 1754 閱讀 1262

寫乙個資料結構(線段樹),實現三個操作

1.區間加減

2.區間乘法

3.區間求和

#include 

using namespace std;

const long

long maxn=1000000*4+10;

long

long

sum[maxn],add[maxn],mul[maxn];

#define root 1,n,1

#define ls l,m,o<<1

#define rs m+1,r,o<<1|1

inline void read(long

long& x)

while(c>='0'&&c<='9')

x=p*n;

}long

long ql,qr,val;

long

long n,m,mod;

inline void pushup(long

long o)

inline void pushdown(long

long o,long

long m)

}void build(long

long l,long

long r,long

long o)

long

long m=l+(r-l)/2;

build(ls);

build(rs);

pushup(o);

}void update_plus(long

long l,long

long r,long

long o)

long

long m=l+(r-l)/2;

if(ql<=m)update_plus(ls);

if(qr>m)update_plus(rs);

pushup(o);

}void update_mul(long

long l,long

long r,long

long o)

long

long m=l+(r-l)/2;

if(ql<=m)update_mul(ls);

if(qr>m)update_mul(rs);

pushup(o);

}long

long query(long

long l,long

long r,long

long o)

long

long m=l+(r-l)/2;

long

long ret=0;

if(ql<=m)ret+=query(ls),ret=ret%mod;

if(qr>m)ret+=query(rs),ret=ret%mod;

return ret%mod;

}int main()

if(op==2)

if(op==3)

}return

0;}

1.這道題調了我一整天,但是我覺得還蠻有意義的。首先我覺得內心終於克服了對資料結構題的恐懼(以前總是怕自己寫不出來,於是一邊抄一遍寫,這樣不僅學不到東西,反而還會打擊自己的自信),這次不一樣,我從頭到尾都是自己在調哦(我僅僅是參考了網上合在一起處理的思維罷了),這也說明我雖然碼力不高,但還是有一點的嘛~

2.吐槽出題者瞎標資料範圍的行為。

3.感謝zfr,ypl的指導。orz之。

線段樹 區間加乘(洛谷P3373模板)

如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包...

P3373 模板 線段樹2

如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 include include using namespace std const int maxn 100005 int n,m,p long long arr maxn...

P3373 模板 線段樹 2

ac 這裡的延遲標記要開兩個,分別記錄加法的值和乘法的值,但是乘法和加法的優先順序不一樣,不規定他們的順序的話會有錯誤,所以可以規定乘法優先,即規定好該結點的值等於該節點的值 父節點的乘法延遲標記的值 父節點加法延遲標記的值 區間長度,即,sum num 2 sum num 2 add num wc...