【題目描述】:
如題,已知乙個數列,你需要進行下面兩種操作:
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...