1. 程式人生 > 實用技巧 >線段樹模板

線段樹模板

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1000010;
ll n,m;
ll a[N];

struct Node{
    ll it;
    ll l;
    ll r;
    ll data;
}tree[N];

void build(ll rt,ll l,ll r){
    tree[rt].l=l;
    tree[rt].r=r;
    tree[rt].it=0;
    if(l==r){
        tree[rt].data=a[l];
        
return ; } ll mid = (l+r)>>1; build(rt*2,l,mid); build(rt*2+1,mid+1,r); tree[rt].data=tree[rt*2].data+tree[rt*2+1].data; return ; } void push_down(ll rt){ if(tree[rt].it!=0){ tree[rt*2].it+=tree[rt].it; tree[rt*2+1].it+=tree[rt].it; ll mid = (tree[rt].l+tree[rt].r)>>1
; tree[rt*2].data+=tree[rt].it*(mid-tree[rt*2].l+1); tree[rt*2+1].data+=tree[rt].it*(tree[rt*2+1].r-mid); tree[rt].it=0; } return ; } void up_data(ll rt,ll l,ll r,ll k){ if(tree[rt].l>=l&&tree[rt].r<=r){ tree[rt].data+=k*(tree[rt].r-tree[rt].l+1
); tree[rt].it+=k; return ; } push_down(rt); if(tree[rt*2].r>=l){ up_data(rt*2,l,r,k); } if(tree[rt*2+1].l<=r){ up_data(rt*2+1,l,r,k); } tree[rt].data=tree[rt*2].data+tree[rt*2+1].data; return ; } ll search(ll rt,ll l,ll r){ if(tree[rt].l>=l&&tree[rt].r<=r){ return tree[rt].data; } push_down(rt); ll num=0; if(tree[rt*2].r>=l){ num+=search(rt*2,l,r); } if(tree[rt*2+1].l<=r){ num+=search(rt*2+1,l,r); } return num; } int main(){ scanf("%lld%lld",&n,&m); for(ll i=1;i<=n;i++){ scanf("%lld",&a[i]); } build(1,1,n); for(ll i=1;i<=m;i++){ ll go; scanf("%lld",&go); if(go==1){ ll a,b,c; scanf("%lld%lld%lld",&a,&b,&c); up_data(1,a,b,c); } if(go==2){ ll a,b; scanf("%lld%lld",&a,&b); printf("%lld\n",search(1,a,b)); } } return 0; }

https://www.cnblogs.com/jason2003/p/9676729.html