線段樹1 洛谷P3372

2022-05-19 02:09:15 字數 1740 閱讀 6526

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

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:

551

5423

2241

2322

3411

5121

4

輸出樣例#1:

11

820

時空限制:1000ms,128m

資料規模:

對於30%的資料:n<=8,m<=10

對於70%的資料:n<=1000,m<=10000

對於100%的資料:n<=100000,m<=100000

(資料已經過加強^_^,保證在int64/long long資料範圍內)

樣例說明:

線段樹真的不好寫啊啊啊啊 但是真的很有用啊啊 樹狀陣列被拋棄了qaq

線段樹2戳這裡哦~

//區間修改區間查詢

#include#include

#include

#define ll long long

#define ls step<<1

#define rs step<<1|1

using

namespace

std;

const ll maxn=100020

;ll n,m,w[maxn

<<2],tag[maxn<<2

],a[maxn];

void

plus(ll step)

void

build(ll step,ll l,ll r)

ll mid=(l+r)>>1

; build(ls,l,mid);

build(rs,mid+1

,r);

plus(step);

}void

push_up(ll step,ll k,ll l,ll r)

void

push_down(ll step,ll l,ll r)

void

update(ll step,ll k,ll l,ll r,ll nl,ll nr)

push_down(step,l,r);

ll mid=(l+r)>>1

;

if(mid>=nl) update(ls,k,l,mid,nl,nr);

if(mid1

,r,nl,nr);

plus(step);

}ll query(ll step,ll l,ll r,ll nl,ll nr)

intmain()

else printf("

%lld\n

",query(1,1

,n,p,q));

}return0;

}

洛谷 P3372 線段樹 1

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

洛谷 P3372 線段樹1

這是一道模板題 線段樹介紹 1 include2 using namespace std 3int m,n 4int a 100001 5 6struct nodexds 4 100001 4倍空間 1011 一 建樹 12void buid int l,int r,int k 19 int m l...

洛谷 P3372 線段樹 模板1

模板一是區間加修改和區間和 例題 如下 include includeusing namespace std struct tree int rt 1,cnt 2 int n,i,m const int maxa 100000 tree tree maxa 1 結構體模擬線段樹 long long ...