•閒話:今天調了一天的線段樹,結果一下午一道題都沒做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...