線段樹 區間修改(加法) 乙個簡單的整數問題

2021-10-08 06:05:29 字數 1121 閱讀 6463

你有n個整數,a1,a2,…,an。 你需要處理兩種操作。 一種操作是在給定間隔中為每個數字新增一些給定數字。 另一種是要求給定間隔中的數字總和。

第一行包含兩個數字n和q.1≤n,q≤100000。

第二行包含n個數字,a1,a2,…,an的初始值。 -1000000000≤ai≤1000000000。

接下來的q行中的每一行代表乙個操作。

「c a b c」表示將c新增到aa,aa + 1,…,ab中的每乙個。 -10000≤c≤10000。

「q a b」表示查詢aa,aa + 1,…,ab的總和。

你需要回到q個詢問,每個詢問一行。

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

樣例輸出455

915總和可能超過32位整數的範圍。

#include

#define ll long long

using

namespace std;

const

int n=

100010

;int n,m;

int w[n]

;struct nodet[

4*n]

;void

pushup

(int u)

void

pushdown

(int u)

}void

build

(int u,

int l,

int r)

else

}void

modify

(int u,

int l,

int r,

int d)

else

}ll query

(int u,

int l,

int r)

intmain()

else

printf

("%lld\n"

,query(1

,l,r));

}return0;

}

線段樹的單點修改加區間修改

const int maxn 1e6 5 int a maxn 存每個數的值 struct node tree maxn 4 void pushup int id 區間合併 void pushdown 區間下放,進行區間修改的時候用到 void build int id,int ll,int rr ...

線段樹(三) 區間修改(乙個標記且有順序)

快速操作序列 給出乙個有 n 個元素的陣列 a 1,a 2,a n 設計乙個資料結構支援以下兩種操作 不難想到把 set 操作進行分解,記錄在結點中,但很快就會發現乙個問題,add操作的時間順序不會影響結果,但set會。比如先執行 add 1,4,1 再執行 add 2,3,2 等價於先執行 add...

線段樹 乙個簡單的整數問題(未完)

你有n個整數,a1,a2,an。你需要處理兩種操作。一種操作是在給定間隔中為每個數字新增一些給定數字。另一種是要求給定間隔中的數字總和。第一行包含兩個數字n和q.1 n,q 100000。第二行包含n個數字,a1,a2,an的初始值。1000000000 ai 1000000000。接下來的q行中的...