寫乙個資料結構(線段樹),實現三個操作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...