洛谷 P3372 線段樹模版題

2021-09-11 21:07:15 字數 1439 閱讀 7012

如題,已知乙個數列,你需要進行下面兩種操作:

1.將某區間每乙個數加上x

2.求出某區間每乙個數的和

輸入格式:

第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。

第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來m行每行包含3或4個整數,表示乙個操作,具體如下:

操作1: 格式:1 x y k 含義:將區間[x,y]內每個數加上k

操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和

輸出格式:

輸出包含若干行整數,即為所有操作2的結果。

輸入樣例#1:複製

5 5

1 5 4 2 3

2 2 4

1 2 3 2

2 3 4

1 1 5 1

2 1 4

輸出樣例#1:複製

11

820

#include using namespace std;

typedef long long ll;

const int maxn=1e5+5;

const int maxm=5e5+5;

const int inf=0x3f3f3f3f;

ll n, a[100005], d[270000], b[270000];

void build(ll l, ll r, ll p)

ll m = (l + r) >> 1;

build(l, m, p << 1), build(m + 1, r, (p << 1) | 1);

d[p] = d[p << 1] + d[(p << 1) | 1];

}void update(ll l, ll r, ll c, ll s, ll t, ll p)

ll m = (s + t) >> 1;

if (b[p])

d[p << 1] += b[p] * (m - s + 1), d[(p << 1) | 1] += b[p] * (t - m),

b[p << 1] += b[p], b[(p << 1) | 1] += b[p];

b[p] = 0;

if (l <= m) update(l, r, c, s, m, p << 1);

if (r > m) update(l, r, c, m + 1, t, (p << 1) | 1);

d[p] = d[p << 1] + d[(p << 1) | 1];

}ll getsum(ll l, ll r, ll s, ll t, ll p)

int main()

return 0;

}

p3372 線段樹模版

題目鏈結 對樣例的樹這樣畫w 從上到下標區間 0 4 這個是tree 0 2 是tree 3 4 是tree 0 1 是tree 是tree 是tree 是tree 是tree 是tree 接下來的都是空結點 然後看 叭 include using namespace std define max ...

洛谷 P3372 線段樹 1

今天植樹節,來種一棵線段樹。傳送門如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第 i 個數字表示數列第 i 項的初始值。接下來m行每...

洛谷P3372 線段樹模板

線段樹講的很詳細的部落格 鏈結 includeusing namespace std typedef long long ll const int maxn 100005 ll dat maxn 儲存資料 ll tree maxn 2 儲存線段樹的陣列常開成資料的4倍大小 ll add maxn 2...