線段樹 求和

2022-05-07 04:09:12 字數 1983 閱讀 3299

本人水平有限,題解不到為處,請多多諒解

本蒟蒻謝謝大家**

題目:time limit: 1 sec  memory limit: 128 mb

submit: 187  solved: 130

[submit][status][web board]

給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。 

注意:初始序列全部為0。

輸出時,只有k=1才輸出,否則繼續執行。

輸入資料第一行包含兩個正整數n,m(n<=100000,m<=500000),以下是m行, 

每行有三個正整數k,a,b(k=0或1, a,b<=n).

k=0時表示將a處數字加上b,k=1時表示詢問區間[a,b]內所有數的和。

對於每個詢問輸出對應的答案。

10 20

0 1 10

1 1 4

0 6 6

1 4 10

1 8 9

1 4 9

0 10 2

1 1 8

0 2 10

1 3 9

0 7 8

0 3 10

0 1 1

1 3 8

1 6 9

0 5 5

1 1 8

0 4 2

1 2 8

0 1 1

1060

616624

1450

41

因為初始序列為0,所以不需要再來建樹。

此題為線段樹模板題,

change(p,l,r,x,v)含義分別是:

p 代表當前樹的編號 ,l 代表左序號,r 代表右序號,x 代表要修改的位置——即需要修改的序號,v 代表要修改的值。

query(int p,int l,int r,int x,int y)含義分別是:

p 代表當前樹的編號 ,l 代表當前左序號,r 代表當前右序號,x 代表查詢左序號,y 代表查詢右序號。

因為修改操作不需要輸出答案,所以遞迴函式使用void   ,  查詢操作要求輸出答案,所以遞迴函式使用int

code:

#include#define maxn 100000

#define maxnn 400000

using

namespace

std;

intn,m;

inta[maxn];

inline

intread()

while(ch<='

9'&&ch>='0'

)

return x*f;

}struct

segment

void update(int

p)

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

build(ls,l,mid);

//找左區間

build(rs,mid+1,r);//

找右區間

update(p);//

更新 }

void change(int p,int l,int r,int x,int v)

if(x<=mid)change(ls,l,mid,x,v);//

當要修改的位置x在mid左時,就遞迴左區間

if(x>mid)change(rs,mid+1,r,x,v);//

當要修改的位置在mid右時,就遞迴右區間

update(p);//

更新 }

int query(int p,int l,int r,int x,int y)

}kd;

intmain()

return0;

}

線段樹 區間求和

給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數k,a,b k 0或1,a,b n k 0時表示將a處數字加上b,k 1時表示詢問區間 a,b 內所有數的和。對於每個詢問輸出對應的答...

模板 線段樹(求和)

線段樹是一種二叉樹可以用陣列來實現 儲存需要的空間為 n往上的2 n取整再乘以2 如 28 32 x 2 64足夠了 我們規定根節點為1 發現每個節點的左子節點為父節點的兩倍,右子節點為父節點的兩倍加一 更新父節點 void build int l,int r,int rt rt root表示當前的...

線段樹(區間更新求和)

poj 3468 include using namespace std define max 100100 struct node 求區間長度 int get dis node tree max 3 long long d max 建樹 long long build int left,int r...