Luogu-P3372 (Lazy_tag 线段树模板)

73 篇文章 0 订阅

题目

分析


程序中线段树用了个结构体封装了起来,存起来。打网络赛时可以复制下来,依题意稍作修改就能用了。

程序

#include <cstdio>
#define INF 100005
int n,m,du,k,k1,k2,k3;

struct segment_tree{
    #define X tr[x]
    #define lx (x<<1)
    #define rx ((x<<1)+1)
    #define L tr[lx]
    #define R tr[rx]
    #define Mid (l+r>>1)
    #define sz(x) (X.r-X.l+1)
    struct node{long long l,r,s,t1;} tr[4*INF];

    long long mer(int x,int y){return tr[x].s+tr[y].s;}

    void bui(int x,int l,int r){
        if (l==r) {X=(node){l,r,(scanf("%d",&du),du),0}; return;}
        bui(lx,l,Mid);
        bui(rx,Mid+1,r);
        X=(node){l,r,mer(lx,rx),0};
    }

    void addtag(int x,int v){
        X.s+=v*sz(x);
        X.t1+=v;
    }
    void Down(int x){
        if (X.t1!=0){
            addtag(lx,X.t1);
            addtag(rx,X.t1);
            X.t1=0;
        }
    }

    void add(int x,int l,int r,int v){
        if (l<=X.l && X.r<=r){addtag(x,v); return;}
        Down(x);
        if (l<=L.r) add(lx,l,r,v);
        if (R.l<=r) add(rx,l,r,v);
        X.s=mer(lx,rx);
    }

    long long que(int x,int l,int r){
        if (l<=X.l && X.r<=r) return X.s;
        Down(x);
        long long ret=0;
        if (l<=L.r) ret+=que(lx,l,r);
        if (R.l<=r) ret+=que(rx,l,r);
        return ret;
    }
}tree;

int main(){
    scanf("%d%d",&n,&m);
    tree.bui(1,1,n);
    while (m-- && scanf("%d",&k)){
        if (k==1){
            scanf("%d%d%d",&k1,&k2,&k3);
            tree.add(1,k1,k2,k3);
        }
        if (k==2){
            scanf("%d%d",&k1,&k2);
            printf("%lld\n",tree.que(1,k1,k2));
        }
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值