數列求和 線段樹基礎

2021-08-26 20:41:07 字數 1197 閱讀 6975

線段樹基礎題

操作包括:1.點修改 2.區間修改 3.區間查詢

// 線段樹基礎:數列求和 

#include#define maxn 10007//數列總個數

#define ls l,m,rt<<1

#define rs m+1,r,rt<<1|1

int sum[maxn<<2],add[maxn<<2];//sum求和,add為惰性標記

int a[maxn],n;//存原資料下標從1開始

//pushup 更新結點資訊,這裡是求和 。用左右子結點更新父親結點

void pushup(int rt)

//build函式建樹

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

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

//左右遞迴

build(ls);

build(rs);

//更新資訊

pushup(rt);

}//點修改,使a[l]+=c

void update1(int l,int c,int l,int r,int rt)

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

//根據條件判斷往左子樹呼叫還是往右子樹呼叫

if(l<=m)

update1(l,c,ls);

else

update1(l,c,rs);

pushup(rt);//子節點更新了,本結點也需要更新

}//下推標記函式

void pushdown(int rt,int ln,int rn)

} //區間修改

void update2(int l,int r,int c,int l,int r,int rt)

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

pushdown(rt,m-l+1,r-m);//下推標記

//判斷左右子樹跟[l,r]有無交集,有交集才遞迴

if(l<=m)

update2(l,r,c,ls);

if(r>m)

update2(l,r,c,rs);

pushup(rt);//更新本結點資訊

}//區間查詢函式

int query(int l,int r,int l,int r,int rt)

int main()

線段樹 求和

本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 time limit 1 sec memory limit 128 mb submit 187 solved 130 submit status web board 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。注意 ...

求和問題(線段樹維護等差數列)

題目描述 你現在有乙個陣列 aa 我們定義如下的兩種操作 1.修改 形如 00 ll rr 效果為對所有 l i rl i r 執行 ai i l 1 ai i l 1 直觀地說就是al 1,al 1 2,al 2 3 ar r l 1al 1,al 1 2,al 2 3 ar r l 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 內所有數的和。對於每個詢問輸出對應的答...