線段樹+差分——【模板】樹狀陣列2
題目來源
洛谷P3368【模板】樹狀陣列2https://www.luogu.org/problem/show?pid=3368
思路
按照差分思想 葉節點記錄這個數與前一個數的差
節點記錄左右兒子(l,r)、區間範圍(x,y)、區間和(num)
查詢x時 遞迴查詢1~x區間和即為數列中第x個數的值
修改x~y的節點加k時 將第x個點加k、第y+1個點減k(即加-k)即可
將第i個點n加v時 對由代表i~i區間的葉節點到根節點的路徑上的節點的num進行修改
程式碼(C++)
#include <cstdio>
using namespace std;
int n,m,c,u,v,w; long long pre=0;
struct tree
{
tree *l,*r;
int x,y;
long long num;
}*root,*null=new tree();
tree* build(int st,int en);
long long ask(int x,tree *pos);
void change(int x,long long k,tree *pos);
int main()
{
scanf("%d%d",&n,&m);
root=build(1,n);
for(int i=1;i<=m;++i)
{
scanf("%d",&c);
if(c==1)
{
scanf("%d%d%lld",&u,&v,&w);
change(u,w,root);
if(v+1<=n)
change(v+1,-w,root);
}
else
{
scanf("%d",&u);
printf("%lld\n",ask(u,root));
}
}
return 0;
}
long long ask(int x,tree *pos)
{
if(x==pos->y)
return pos->num;
if(x>=pos->r->x)
return ask(x,pos->r)+pos->l->num;
else
return ask(x,pos->l);
}
void change(int x,long long k,tree *pos)
{
if(pos->l==null&&pos->y==x)
{
pos->num+=k;
return ;
}
if(x<=pos->l->y)
change(x,k,pos->l);
else
change(x,k,pos->r);
pos->num=pos->l->num+pos->r->num;
return ;
}
tree* build(int st,int en)
{
tree *pos=new tree();
pos->x=st; pos->y=en;
if(st==en)
{
pos->l=null; pos->r=null;
scanf("%lld",&pos->num);
pos->num-=pre;
pre+=pos->num;
}
else
{
pos->l=build(st,(st+en)/2);
pos->r=build((st+en)/2+1,en);
pos->num=pos->l->num+pos->r->num;
}
return pos;
}
相關文章
- hdu 4836 The Query on the Tree(線段樹or樹狀陣列)陣列
- HDU 1556 Color the ball(線段樹|樹狀陣列)陣列
- 【筆記/模板】樹狀陣列筆記陣列
- 【luogu3368】模板 樹狀陣列 2陣列
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- light oj 1080 線段樹和樹狀陣列陣列
- 線段樹差分及其應用
- 樹狀陣列模板+習題集陣列
- 線段樹模板
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- 洛谷題單指南-二叉堆與樹狀陣列-P3368 【模板】樹狀陣列 2陣列
- 樹狀陣列陣列
- T4701 【卜卜】樹狀陣列模板陣列
- 線段樹模板總結
- 解析樹狀陣列陣列
- 2024年暑假關於線段樹和樹狀陣列的小知識點陣列
- [18/03/24] 線段樹模板
- 【筆記/模板】線段樹(改)筆記
- LeetCode C++ 劍指 Offer 51. 陣列中的逆序對【歸併排序/樹狀陣列/線段樹】LeetCodeC++陣列排序
- hdu 4368 樹狀陣列 離線維護陣列
- 樹狀陣列詳解陣列
- 樹狀陣列基礎陣列
- poj 2481 樹狀陣列陣列
- hdu 3874 樹狀陣列陣列
- 二維樹狀陣列陣列
- 【Leetcode每日一題】327. 區間和的個數(線段樹/樹狀陣列)LeetCode每日一題陣列
- P3834 【模板】可持久化線段樹 2持久化
- SPOJ DQUERY (離線數狀陣列||線上主席樹)陣列
- 關於區間操作查詢(字首和與差分)+樹狀陣列基礎陣列
- 樹狀陣列和逆序對陣列
- hdu 5147 樹狀陣列陣列
- 樹狀陣列快速入門陣列
- 暫存一下線段樹模板
- 線段樹模板重製(自寫自用)
- hihocoder 1078 線段樹的區間修改 (線段樹 區間更新 模板)
- CF 293 E Close Vertices (樹的分治+樹狀陣列)陣列
- 樹狀陣列3種基本操作陣列
- 學習筆記----樹狀陣列筆記陣列