UOJ 56 線段樹區間加和乘

2022-05-23 09:45:13 字數 1622 閱讀 9030

【題目描述】:

如題,已知乙個數列,你需要進行下面兩種操作:

1.將某區間每乙個數加上x

2.將某區間每乙個數乘上x

3.求出某區間每乙個數的和

【輸入描述】:

第一行包含三個整數n、m、p,分別表示該數列數字的個數、操作的總個數和模數。

第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來m行每行包含3或4個整數,表示乙個操作,具體如下:

操作1: 格式:1 x y k 含義:將區間[x,y]內每個數乘上k(>0)

操作2: 格式:2 x y k 含義:將區間[x,y]內每個數加上k(>0)

操作3: 格式:3 x y 含義:輸出區間[x,y]內每個數的和對p取模所得的結果

【輸出描述】:

輸出包含若干行整數,即為所有操作3的結果。

【樣例輸入】:

5 5 38

1 5 4 2 3

2 1 4 1

3 2 5

1 2 4 2

2 3 5 5

3 1 4

【樣例輸出】:172

【時間限制、資料範圍及描述】:

對於30%的資料:n<=10,m<=10

對於70%的資料:n<=1,000,m<=10,000

對於100%的資料:n<=100,000,m<=100,000

code:

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int n=2000005;

long long p,k,c[n],sum[n],addv[n],mulv[n];

int n,m,i,f,x,y;

void build(int o,int l,int r)

else

}

void push_down(int o,int l,int r,int mid,int lson,int rson)

void addall(int o,int l,int r,int a,int b,int x)

else

if(a<=mid)

if(b>mid)

sum[o]=(sum[lson]+sum[rson])%p;

}}void mulall(int o,int l,int r,int a,int b,int x)

else

if(a<=mid)

if(b>mid)

sum[o]=(sum[lson]+sum[rson])%p;

}}long long query(int o,int l,int r,int a,int b)

else

if(a<=mid)

if(b>mid)

return ans%p;

}}int main()

build(1,1,n);

for(i=1;i<=m;i++)

case 2:

case 3: }}

return 0;

}

線段樹 區間加乘區間最大

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

維護序列(線段樹維護區間乘 區間加)

給定乙個長度為n的原序列和模數mod,m個操作,a,b 區間乘c,a,b 區間加c,統計 a,b 的區間和。思路 線段樹維護的還是區間和,但是這裡我們需要用到兩個懶標記,乙個記錄加法,乙個記錄乘法,乘法懶標記下傳之後要重置為1而不是0。對於乙個乘法操作,他影響的是區間和還有這個區間的加法標記 乘法標...

線段樹 二 區間乘 區間加

放 注意點 注意運算子優先順序 比如 a b p 是b先mod p再與a相乘 a 1 1是1 1再a位移 a 1 a 2 a 1 1 a 2 1 參見 線段樹v2.0 支援區間加 區間乘 區間和查詢 include include include define n 1000010 using nam...