線段樹問題

2021-07-04 16:58:29 字數 1542 閱讀 7217

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