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;
    }

  • 相关阅读:
    x-pack-crack
    ELK获取用户真实IP
    多层代理获取用户真实IP
    ELK帮助文档
    logstash filter plugin
    开源实时日志分析ELK平台部署
    消息队列集群kafka安装配置
    日志采集客户端 filebeat 安装部署
    rsync + inotify 同步
    【转】OpenWrt 防火墙/etc/config/firewall介绍
  • 原文地址:https://www.cnblogs.com/647Z/p/7354734.html
Copyright © 2011-2022 走看看