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 的最小值 輸...