• 线段树Final版本


    结构体是个好东西。。。

    看着逼格很高

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define l(x) (x<<1)
    #define r(x) ((x<<1)|1)
    #define ll long long
    using namespace std;
    
    struct Treenode{int l,r;ll tag,val;};
    struct Segtree
    {
        Treenode tr[5*100010];
        void pushup(int id){tr[id].val=tr[l(id)].val+tr[r(id)].val;}
        void pushdown(int id)
        {
            tr[l(id)].val+=tr[id].tag*(tr[l(id)].r-tr[l(id)].l+1);
            tr[r(id)].val+=tr[id].tag*(tr[r(id)].r-tr[r(id)].l+1);
            tr[l(id)].tag+=tr[id].tag;tr[r(id)].tag+=tr[id].tag;
            tr[id].tag=0;
        }
        void build(int id,int L,int R)
        {
            tr[id].l=L,tr[id].r=R;
            tr[id].tag=0;
            if(L==R)
            {
                scanf("%lld",&tr[id].val);
                return;
            }
            int mid=(L+R)>>1;
            build(l(id),L,mid);
            build(r(id),mid+1,R);
            pushup(id);
        }
        void update(int id,int L,int R,ll k)
        {
            if(tr[id].l>=L && tr[id].r<=R)
            {
                tr[id].val+=k*(tr[id].r-tr[id].l+1);
                tr[id].tag+=k;
                return;
            }
            if(tr[id].tag)pushdown(id);
            int mid=(tr[id].l+tr[id].r)>>1;
            if(L<=mid)update(l(id),L,R,k);
            if(R>mid) update(r(id),L,R,k);
            pushup(id);
        }
        ll query(int id,int L,int R)
        {
            if(tr[id].l>=L && tr[id].r<=R)return tr[id].val;
            if(tr[id].tag)pushdown(id);
            int mid=(tr[id].l+tr[id].r)>>1;
            ll ans=0;
            if(L<=mid)ans+=query(l(id),L,R);
            if(R>mid)ans+=query(r(id),L,R);
            return ans;
        }
    }Seg;
    
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        Seg.build(1,1,n);
        while(m--)
        {
            int opt,x,y,k;
            scanf("%d",&opt);
            if(opt==1)
            {
                scanf("%d%d%d",&x,&y,&k);
                Seg.update(1,x,y,k);
            }
            if(opt==2)
            {
                scanf("%d%d",&x,&y);
                printf("%lld
    ",Seg.query(1,x,y));
            }
        }
    }
    View Code
  • 相关阅读:
    WEB上传大文件
    Java+超大文件上传
    php+文件夹上传
    php上传视频大文件
    每一个程序猿需掌握的20个代码命名小贴士
    Mysql整数运算NULL值处理注意点
    拓展欧几里得模板
    bzoj 1088 简单dfs
    决策树
    进程-IPC 管道 (一)
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/7780895.html
Copyright © 2020-2023  润新知