description
給出了乙個序列,你需要處理如下兩種詢問。
"c a b c"表示給[a, b]區間中的值全部增加c (-10000 ≤ c ≤ 10000)。
"q a b" 詢問[a, b]區間中所有值的和。
input
第一行包含兩個整數n, q。1 ≤ n,q ≤ 100000.
第二行包含n個整數,表示初始的序列a (-1000000000 ≤ ai ≤ 1000000000)。
接下來q行詢問,格式如題目描述。
output
對於每乙個q開頭的詢問,你需要輸出相應的答案,每個答案一行。
sample input
10 5
1 2 3 4 5 6 7 8 9 10
q 4 4
q 1 10
q 2 4
c 3 6 3
q 2 4
sample output455
915用樹狀陣列的做法會超時,使用線段樹進行區間更新
#include#include#define min -10010
__int64 segtree[400000], a[100010], mark[400000];
void build(int l , int r, int id)
int mid = (l+r)>>1;
build(l, mid, id<<1);
build(mid+1, r, id<<1|1);
segtree[id] = segtree[id<<1] + segtree[id<<1|1];
} void pushdown(int id, int l, int r) }
__int64 query(int l, int r, int id, int l, int r)
pushdown(id, l, r);
int mid = (l+r)>>1;
__int64 sum = 0;
if(l <= mid)
sum += query(l, mid, id<<1, l, r);
if(r >= mid +1)
sum += query(mid+1, r, id<<1|1, l, r);
return sum;
} void update(int l, int r, int id, int left, int right, int cnt)
pushdown(id, l, r);
int mid = (l+r)>>1;
if(left <= mid)
update(l, mid, id<<1, left, right, cnt);
if(right >= mid+1)
update(mid+1, r, id<<1|1, left, right, cnt);
segtree[id] = segtree[id<<1] + segtree[id<<1|1];
}int main()
else
}return 0;
}
線段樹著色問題
線段樹節點記錄區間左右座標和區間顏色 如果父節點i表示 left,right 那麼父節點的左節點i 2表示區間 left,mid 有節點表示 mid 1,right 其中mid為left和right的中點 所有的節點存在tree陣列裡面 葉節點表示乙個點,即區間左右座標是一樣的 根節點代表區間 1,...
RMQ問題 st 線段樹
j 演算法 rmq range minimum maximum query 問題是指 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在 i,j 裡的最小 大 值,也就是說,rmq問題是指求區間最值的問題 主要方法及複雜度 處理複雜度和查詢複雜度 如下 1.樸素 即...
區間眾數問題,線段樹
區間眾數,利用線段樹,維護區間眾數轉換的平度序列。線段樹記錄區間最大值,即為連續區間眾數連續個數。平度序列例如 1 1 1 1 2 3 3 3 1 2 3 4 1 1 2 3 include include include include include include using namespac...