線段樹練習5

2021-08-05 23:13:22 字數 1798 閱讀 3176

•閒話:今天調了一天的線段樹,結果一下午一道題都沒做qaq,現在一看到**就眼疼。。。感覺要很久才能恢復過來orz… 不過這個題對於線段樹來說應該是個很好的模板題2333

有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]的最小值

第一行兩個整數n,m,第二行n個整數表示這n個數的初始值

接下來m行操作,同題目描述

對於所有的sum、max、min詢問,一行輸出乙個答案
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

49

114

10%:1#include

#include

#include

#include

using namespace std

;#define ll long long

const int maxn=1e6+2

;struct mapletree[maxn<<2];

ll n,m,x,y,z

;ll a[maxn<<2];

void dodata(ll n)

void build(ll l,ll r,ll n)

build(l,mid,n<<1);

build(mid+1,r,n<<1|1);

dodata(n);

}ll dosum(ll n,ll x)

void spread(ll n)

tree[n<<1].add+=a;

tree[n<<1|1].add+=a;

tree[n<<1].sum+=dosum(n<<1,a);

tree[n<<1|1].sum+=dosum(n<<1|1,a);

tree[n<<1].minn+=a;

tree[n<<1|1].minn+=a;

tree[n<<1].maxn+=a;

tree[n<<1|1].maxn+=a;

a=0;}

ll ask_sum(ll n,ll l,ll r)

void add(ll l,ll r,ll n,ll x)

spread(n);

int mid=(l+r)>>1

; if(l<=mid) add(l,r,n<<1,x);

if(r>mid) add(l,r,n<<1|1,x);

dodata(n);

}ll ask_max(ll n,ll l,ll r)

ll ask_min(ll n,ll l,ll r)

void set(ll n,ll l,ll r,ll x)

spread(n);

int mid=(l+r)>>1

; if(l<=mid) set(n<<1,l,r,x);

if(r>mid) set(n<<1|1,l,r,x);

dodata(n);

}int main()

return 0

;}

4927 線段樹練習5

4927 線段樹練習5 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 題目描述 description 有n個數和5種操作 add a b c 把區間 a,b 內的所有數都增加c set a b c 把區間 a,b 內的所有數都設為c sum a b 查詢區...

4927 線段樹練習5

時間限制 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 的最...

Codeves 4279 線段樹練習5

有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 descrip...