線段樹基礎題
操作包括: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 內所有數的和。對於每個詢問輸出對應的答...