題目描述 description
有n個數和5種操作
add a b c:把區間[a,b]內的所有數都增加c
set a b c:把區間[a,b]內的所有數都設為c
sum a b:查詢區間[a,b]的區間和
max a b:查詢區間[a,b]的最大值
min a b:查詢區間[a,b]的最小值
輸入描述 input description
第一行兩個整數n,m,第二行n個整數表示這n個數的初始值
接下來m行操作,同題目描述
輸出描述 output description
對於所有的sum、max、min詢問,一行輸出乙個答案
樣例輸入 sample input
10 6
3 9 2 8 1 7 5 0 4 6
add 4 9 4
set 2 6 2
add 3 8 2
sum 2 10
max 1 7
min 3 6
樣例輸出 sample output
資料範圍及提示 data size & hint
10%:130%:1100%:1保證中間結果在long long(c/c++)、int64(pascal)範圍內
/*線段樹的裸題,用分塊寫略麻煩。
對於每個塊維護兩個標記,新增標記和修改標記,修改的時候對於完整的塊只修改標記,對於不完整的塊,暴力修改,查詢也是一樣。
*/#include
#include
#include
#define n 100010
#define inf 1000000000
#define lon long long
using
namespace
std;
intval[n],mx[n],mn[n],tag1[n],tag2[n],bl[n],n,m,len;lon sum[n];
void pushdown(int
k)
if(tag1[k])
}void modify(int x,int y,int
z)
//下放y不完整區間
if(bl[x]==bl[y]) return
; k=bl[y];pushdown(k);
for(int i=(k-1)*len+1;i<=y;i++) val[i]+=z;
sum[k]=0;mx[k]=-inf;mn[k]=inf;
for(int i=(k-1)*len+1;i<=min(k*len,n);i++)
sum[k]+=(lon)val[i],mx[k]=max(mx[k],val[i]),mn[k]=min(mn[k],val[i]);
}void change(int x,int y,int
z)lon querysum(
int x,int
y)int querymax(int x,int
y)int querymin(int x,int
y)int
main()
for(int i=1;i<=n;i++)
char op[10];int
x,y,z;
for(int i=1;i<=m;i++)
return0;
}
codevs 線段樹練習4
題目描述 給你n個數,有兩種操作 1 給區間 a,b 內的所有數都增加x 2 詢問區間 a,b 能被7整除的個數 輸入描述 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數是add,後接3個正整數a,b,x,表示在區間 a,b 內每...
codevs1080線段樹練習(線段樹)
題目描述 description 一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數m...
AC日記 線段樹練習5 codevs 4927
時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解有n個數和5種操作 add a b c 把區間 a,b 內的所有數都增加c set a b c 把區間 a,b 內的所有數都設為c sum a b 查詢區間 a,b 的區間和 max a b 查詢區間 a,b 的最大值 min ...