zoukankan      html  css  js  c++  java
  • 线段树模板,全网最好!没有之一,新手学习必看

    #include<bits/stdc++.h>//一般的线段树模板,但是非常简单,
    using namespace std;
    struct node{
    long long l,r,sum;
    }t[300001];
    long long a[100001],lazy[300001];
    void bt(long long x,long long l,long long r)
    {
    t[x].l=l;
    t[x].r=r;
    if(l==r)
    {
    t[x].sum=a[l];
    return;
    }
    bt(x*2,l,(l+r)>>1);
    bt(x*2+1,1+((l+r)>>1),r);
    t[x].sum=t[x*2].sum+t[x*2+1].sum;
    }
    void pushdown(long long x)
    {
    long long mid=(t[x].l+t[x].r)/2;
    t[x*2].sum+=(mid-t[x].l+1)*lazy[x];
    t[x*2+1].sum+=(t[x].r-mid)*lazy[x];
    lazy[x*2]+=lazy[x];
    lazy[x*2+1]+=lazy[x];
    lazy[x]=0;
    }
    void update(long long x,long long l,long long r,long long k)
    {
    if(t[x].r<=r&&t[x].l>=l)
    {
    t[x].sum+=(t[x].r-t[x].l+1)*k;
    lazy[x]+=k;
    return ;
    }
    if(t[x].r<l||t[x].l>r)
    return;
    if(lazy[x])pushdown(x);
    update(x*2,l,r,k);
    update(x*2+1,l,r,k);
    t[x].sum=t[x*2].sum+t[x*2+1].sum;
    }
    long long query(long long x,long long l,long long r)
    {
    if(t[x].r<=r&&t[x].l>=l)
    return t[x].sum;
    if(t[x].r<l||t[x].l>r)
    return 0;
    if(lazy[x])pushdown(x);
    return query(x*2,l,r)+query(x*2+1,l,r);
    }
    int main()
    {
    long long n,m,x,y,z,t;
    cin>>n>>m;
    for(long long i=1;i<=n;i++)
    scanf("%lld",&a[i]);
    bt(1,1,n);
    for(long long i=1;i<=m;i++)
    {
    scanf("%lld%lld%lld",&t,&x,&y);
    if(t==1)
    {
    scanf("%lld",&z);
    update(1,x,y,z);
    }
    else cout<<query(1,x,y)<<endl;
    }

    return 0;
    }

  • 相关阅读:
    Thread
    投资
    DBLink
    sql
    列转行
    DataTable,DataView,DataRowView,DefaultView与DataSet
    Vue.js 基础学习之组件
    Vue.js 基础学习计算属性computed
    v-model的修饰符和使用
    Vue.js 基础学习 v-on 指令
  • 原文地址:https://www.cnblogs.com/647Z/p/7354734.html
Copyright © 2011-2022 走看看