树状树组区间修改,单点修改模板
Posted hh13579
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状树组区间修改,单点修改模板相关的知识,希望对你有一定的参考价值。
单点修改
#include <iostream> #include <cstring> #include <stack> #include <cstdio> #include <cmath> #include <queue> #include <algorithm> #include <vector> #include <set> #include <map> using namespace std; #define ll long long const int N=500005; int a,c[N],n,m=0; int sum(int x) int ans=0; for(;x;x-=x&-x) ans=ans+c[x]; return ans; void add(int x,int y) for(;x<=N-1;x+=x&-x) c[x]+=y; int main() ll ans=0; int x,y,z; cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d",&a); add(i,a); for(int i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&z); if(x==1) add(y,z); else printf("%d\n",sum(z)-sum(y-1)); return 0;
区间修改
#include<bits/stdc++.h> #define ll long long #define lowbit(x) x&-x using namespace std; const int N=5e5+10; ll tree[N]; int n,m; void add(int x,ll num) while(x<=n) tree[x]+=num; x+=lowbit(x); ll query(int x) ll ans=0; while(x) ans+=tree[x]; x-=lowbit(x); return ans; int main() scanf("%d%d",&n,&m); long long last=0,now; for(int i=1;i<=n;i++) scanf("%lld",&now); add(i,now-last); last=now; int flag; while(m--) int x,y; ll k; scanf("%d",&flag); if(flag==1) scanf("%d%d%lld",&x,&y,&k); add(x,k); add(y+1,-k); else scanf("%d",&x); printf("%lld\n",query(x)); return 0;
以上是关于树状树组区间修改,单点修改模板的主要内容,如果未能解决你的问题,请参考以下文章