線段樹練習5(codevs 4927)

2022-05-14 05:39:00 字數 1683 閱讀 4625

題目描述 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 ...