傳送門
此題涉及區間修改,稍微需要注意一點的地方就是它又有區間乘,又有區間加。
所以我們在處理到區間乘的時候要順帶把lazy_add標記也乘以相應的值(程式裡是lazya [ ] )
注意:用來記錄乘的懶標記初值應該為1
#include#include#include#include#include#include#include#define in read()
#define ull unsigned long long
#define n 100009
#define lc (k<<1)
#define rc ((k<<1)+1)
using namespace std;
int n,m;
ull sum[4*n],lazya[4*n],lazym[4*n],a[n],p;//別忘了4倍空間
inline ull read()
return f==1?res:-res;
}void build(int k,int l,int r)
int mid=l+r>>1;
build(lc,l,mid);build(rc,mid+1,r);
sum[k]=(sum[lc]+sum[rc])%p;
}void pushdown(int k,int l,int r,int mid)
void modifya(int k,int l,int r,int x,int y,int z)
int mid=l+r>>1;
if(lazya[k]!=0||lazym[k]!=1) pushdown(k,l,r,mid);
if(x<=mid) modifya(lc,l,mid,x,y,z);
if(y>mid) modifya(rc,mid+1,r,x,y,z);
sum[k]=(sum[lc]+sum[rc])%p;
}void modifym(int k,int l,int r,int x,int y,int z)
int mid=l+r>>1;
if(lazya[k]!=0||lazym[k]!=1) pushdown(k,l,r,mid);
if(x<=mid) modifym(lc,l,mid,x,y,z);
if(y>mid) modifym(rc,mid+1,r,x,y,z);
sum[k]=(sum[lc]+sum[rc])%p;
}ull querysum(int k,int l,int r,int x,int y)
int main()
} return 0;
}
線段樹2 洛谷p3373 線段樹
題目位址 解釋 多了乙個乘法操作,可以考慮優先順序。每次先算乘法。首先,對於乙個區間 和為s 假設已經按 a 乘b進行了操作。值得到的值為 s a b sb ab 假設先乘得到 sb a 這樣相比,add應該還要再乘上乙個b才對,所以,當更新到乙個區間時,為了進行先乘的操作而不讓結果發生變化,應該將...
洛谷 P3372 線段樹 1
今天植樹節,來種一棵線段樹。傳送門如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第 i 個數字表示數列第 i 項的初始值。接下來m行每...
洛谷 P3373 線段樹 2
作為一道調了三天的模板題,真的太虐心了對於理解線段樹大有用處。傳送門如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空...