zoukankan      html  css  js  c++  java
  • 线段树自用模板

    include <stdio.h>

    include <string.h>

    define ll long long

    void pushup(ll rt)
    {
    sum[rt]=sum[re<<1]+sum[rt<<1|1];
    }
    void build(ll l,ll r,ll x)//建树
    {
    if (lr)
    {
    sum[rt]=a[l];
    return;
    }
    ll mid=(l+r)>>1;
    build(l,mid,x<<1);
    build(mid+1,r,x<<1|1);
    //更新信息
    pushup(x);
    }
    //点修改
    void update(ll L,ll c,ll l,ll r,ll x)
    {
    if (l
    r)
    {
    sum[x]+=c;
    return;
    }
    ll mid=(l+r)>>1;
    if (L<=mid)
    update(L,c,l,mid,x<<1);
    else
    update(L,c,mid+1,r,x<<1|1);

    pushup(x);
    

    }
    //区间修改
    void update(ll x,ll y,ll c ,ll l,ll r,ll x)
    {
    if (x<=l&&y<=r)
    {
    sum[x]+=c*(r-l+1);
    lazy[x]+=c;
    return;
    }
    ll mid=(l+r)>>1;
    pushdown(x,mid-l+1,r-mid);//?下准标记?

    if (x<=mid)
    	update(x,y,c,l,mid,x<<1);
    if (y>mid)
    	update(x,y,c,mid+1,r,x<<1|1);
    

    }
    //区间查询
    void pushdown(ll x,ll ln,ll rn)//下推标记函数
    {
    if (lazy[x])
    {
    lazy[x<<1]+=lazy[x];
    lazy[x<<1|1]+=lazy[x];
    //修改子节点的Sum使之与对应的Add相对应
    sum[x<<1]+=lazy[x]ln;
    sum[x<<1|1]+=lazy[x]
    rn;

    	lazy[x]=0;
    }
    

    }
    //查询
    int query(ll L,ll R,ll l,ll r,ll x)
    {
    if (L<=l&&r<=R)
    return sum[x];

    ll mid=(l+r)>>1;
    //下推标记,否则Sum可能不正确
    pushdowm(x,mid-l+1,r-mid);//
    
    ll sum=0;
    if (L<=mid)
    sum+=query(L,R,l,mid,x<<1);
    if (R>m)
    sum+=query(L,R,mid+1,r,x<<1|1);
    return sum;
    

    }

  • 相关阅读:
    indexOf & lastIndexOf
    document.referrer
    函数组合
    v-model绑定vuex中的数据
    图片懒加载
    flex布局问题
    js常见错误类型
    es5/es6继承的区别
    合并两个有序数组
    lettcode 90 子集II
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/13734134.html
Copyright © 2011-2022 走看看