有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)範圍內
題解:線段樹基本操作,區間修改,區間加,區間求最大,最小值;
1 #include2 #include3view code#define n 100001
4using
namespace
std;
5int
n,m,x,y;
6long
longz;7
long
long
ans;
8struct
node
9tr[n*4
]; 14
void up(int
k)15
20void build(int k,int l,int
r)21
29int mid=l+r>>1
;30 build(k<<1
,l,mid);
31 build(k<<1|1,mid+1
,r);
32up(k);33}
34void down_set(int
k)35
45void down_add(int
k)46
58void addd(int
k)59
68if
(tr[k].v) down_set(k);
69if
(tr[k].add) down_add(k);
70int mid=tr[k].l+tr[k].r>>1;71
if(x<=mid) addd(k<<1
);72
if(y>mid) addd(k<<1|1
);73
up(k);
74}
75void sett(int
k)76
85if
(tr[k].v) down_set(k);
86if
(tr[k].add) down_add(k);
87int mid=tr[k].l+tr[k].r>>1;88
if(x<=mid) sett(k<<1
);89
if(y>mid) sett(k<<1|1
);90
up(k);91}
92void query(int k,int
w)93
101if
(tr[k].v) down_set(k);
102if
(tr[k].add) down_add(k);
103int mid=tr[k].l+tr[k].r>>1
;104
if(x<=mid) query(k<<1
,w);
105if(y>mid) query(k<<1|1
,w);
106}
107int
main()
108120
else
if(ch[1]=='e'
)121
125else
if(ch[1]=='u'
)126
132else
if(ch[1]=='a'
)133
139else
140
146}
147 }
線段樹練習
一鍵挖礦 includeusing namespace std define n 2000010 define int long long define f x x 1 x 3 int n,m,tg n x n y n tx 4 ty 4 ans vectorv n struct vac n va ...
線段樹練習四(線段樹)
description 在平面內有一條長度為n的線段 不計入答案 可以對進行以下2種操作 1 把從x到y的再加一條線段 2 查詢從x到x 1有多少條線段 input 第一行輸入n,m 第2 m 1行,每行2個數x,y,表示從x到y再加一條線段 最後一行輸入2個數,為x和x 1,查詢x到x 1的線段數...
1080 線段樹練習
一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數m 10000條。輸入描述 inpu...