线段树模板
Posted charls
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树模板相关的知识,希望对你有一定的参考价值。
维护区间加法
https://www.luogu.com.cn/problem/P3374
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxN=500000; struct Node{ int l; int r; ll sum; ll add; Node(){ l=0; r=0; sum=0; } }Tree[maxN*4]; int n,m; int a[500005]; inline int lc(int p){ return p<<1; } inline int rc(int p){ return p<<1|1; } long long ans=0; void BuildTree(int k,int l,int r) { Tree[k].l=l; Tree[k].r=r; if(l==r){ Tree[k].sum=a[l]; return; } int mid=(l+r)>>1; BuildTree(k<<1,l,mid); BuildTree(k<<1|1,mid+1,r); Tree[k].sum=Tree[k<<1].sum+Tree[k<<1|1].sum; } void push_down(int id) { if(Tree[id].add) { int v=Tree[id].add; Tree[id].add=0; Tree[id<<1].sum+=v*(Tree[id<<1].r-Tree[id<<1].l+1); Tree[id<<1|1].sum+=v*(Tree[id<<1|1].r-Tree[id<<1|1].l+1); Tree[id<<1].add+=v; Tree[id<<1|1].add+=v; } } void update(int id,int l,int r,int k) { if(l<=Tree[id].l&&Tree[id].r<=r) { Tree[id].sum+=k*(Tree[id].r-Tree[id].l+1); Tree[id].add+=k; return; } push_down(id); int mid=(Tree[id].l+Tree[id].r)>>1; if(l<=mid) update(id<<1,l,r,k); if(r>=mid+1) update(id<<1|1,l,r,k); Tree[id].sum=Tree[id<<1].sum+Tree[id<<1|1].sum; } void Query(int id,int l,int r) { if(l<=Tree[id].l&&Tree[id].r<=r) { ans+=Tree[id].sum; return; } push_down(id); int mid=(Tree[id].l+Tree[id].r)>>1; if(l<=mid) Query(id<<1,l,r); if(r>=mid+1) Query(id<<1|1,l,r); } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } BuildTree(1,1,n); int type,x,y,k; for(int i=0;i<m;i++) { cin>>type; if(type==1) { cin>>x>>y>>k; update(1,x,y,k); } else { ans=0; cin>>x>>y; Query(1,x,y); cout<<ans<<endl; } } }
以上是关于线段树模板的主要内容,如果未能解决你的问题,请参考以下文章