4927 線段樹練習5

2021-07-29 21:29:45 字數 1957 閱讀 9273

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:查詢區間[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

49注意

set有可能是0,所以立個flag

錯了兩次了qwq

#include

#include

#include

#include

using

namespace

std;

const

int n=100000+50;

int n,q,x,y,z;

long

long num[n];

struct seg_treet[n<<2];

void updata(int m)

void build(int m,int ll,int rr)

int mid=ll+rr>>1;

build(m<<1,ll,mid);//遞迴處理左兒子

build(m<<1|1,mid+1,rr);//右兒子

updata(m);//回溯資料收集

return ;

}void add(int m,int v)

void

set(int m,int v)

void spread(int m)

if(t[m].ax_add)

return ;

}void change_add(int m,int ll,int rr,int v)

spread(m);

int mid=t[m].l+t[m].r>>1;

if(mid>=ll) change_add(m<<1,ll,rr,v);

if(mid1|1,ll,rr,v);

updata(m);

return ;

}void change_set(int m,int ll,int rr,int v)

spread(m);

int mid=t[m].l+t[m].r>>1;

if(mid>=ll) change_set(m<<1,ll,rr,v);

if(mid1|1,ll,rr,v);

updata(m);

return ;

}long

long ask_sum(int m,int ll,int rr)

long

long ask_minn(int m,int ll,int rr)

long

long ask_maxx(int m,int ll,int rr)

int main()

return

0;}

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 的最...

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 的最...

線段樹練習5(codevs 4927)

題目描述 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 的最小值 輸...