0817 線段樹板子 洛谷P3373

2021-08-24 20:45:52 字數 1327 閱讀 5214

傳送門

此題涉及區間修改,稍微需要注意一點的地方就是它又有區間乘,又有區間加。

所以我們在處理到區間乘的時候要順帶把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個用空...