• POJ 3468


    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    #define maxn 100010
    #define ll long long
    #define lson rt<<1,l,mid
    #define rson (rt<<1)|1,mid+1,r
    struct node
    {
        int l,r;
        ll sum;
        ll flag;
    }tree[300010];
    int a[maxn];
    void pushup(int rt)
    {
        tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
    }
    void pushdown(int rt)
    {
        if(tree[rt].flag)
        {
            tree[rt<<1].flag+=tree[rt].flag;
            tree[rt<<1|1].flag+=tree[rt].flag;
            tree[rt<<1].sum+=tree[rt].flag*(tree[rt<<1].r-tree[rt<<1].l+1);
            tree[rt<<1|1].sum+=tree[rt].flag*(tree[rt<<1|1].r-tree[rt<<1|1].l+1);
            tree[rt].flag=0;
        }
    
    }
    void build(int rt,int l,int r)
    {
        tree[rt].l=l;
        tree[rt].r=r;
        tree[rt].flag=0;
        if(l==r)
        {
            tree[rt].sum=a[l];
            return ;
        }
        int mid=(l+r)>>1;
        build(lson);
        build(rson);
        pushup(rt);
    
    }
    void update(int rt,int l,int r,int c)
    {
        if(l<=tree[rt].l&&tree[rt].r<=r)
        {
            tree[rt].flag+=c;
            tree[rt].sum+=(ll)c*(tree[rt].r-tree[rt].l+1);
            return ;
        }
        pushdown(rt);
        int mid=(tree[rt].l+tree[rt].r)>>1;
        if(r<=mid)
            update(rt<<1,l,r,c);
        else
            if(l>=mid+1)
            {
                update(rt<<1|1,l,r,c);
    
            }
            else
            {
                update(rt<<1,l,mid,c);
                update(rt<<1|1,mid+1,r,c);
            }
        pushup(rt);
    }
    ll query(int rt,int l,int r)
    {
        if(l<=tree[rt].l&&tree[rt].r<=r)
            return tree[rt].sum;
        pushdown(rt);
        int mid=(tree[rt].l+tree[rt].r)>>1;
        ll ans=0;
        if(r<=mid)
        {
            ans+=query(rt<<1,l,r);
        }
        else
            if(l>=mid+1)
                ans+=query(rt<<1|1,l,r);
            else
            {
                ans+=query(rt<<1,l,mid);
                ans+=query(rt<<1|1,mid+1,r);
            }
        return ans;
    }
    int main()
    {
    
        int n,q;
        //while(scanf("%d%d",&n,&q))
       // {
           // if(n==0&&q==0) break;
           scanf("%d%d",&n,&q);
            int i;
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            build(1,1,n);
            char ch;
            int x,y,z;
            while(q--)
            {
                scanf(" %c",&ch);
                if(ch=='Q')
                {
                    scanf("%d%d",&x,&y);
                    printf("%lld
    ",query(1,x,y));
                }
                else
                    if(ch=='C')
                    {
                        scanf("%d%d%d",&x,&y,&z);
                        update(1,x,y,z);
    
                    }
            }
        //}
        return 0;
    }
  • 相关阅读:
    谈谈关于个人提升的一些思考
    asp.net 委托用法
    DNN 配置 数据库篇
    一个技术为主的博客沦落为娱乐休息的场所
    NDO 组件和例子下载,内置了一个基于Velocity模版引擎的代码生成器
    DNN 研究路线图
    学习DNN开发模块插件的几条主线
    NDO 快速入门
    NDO 简介
    也谈代码生成器
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755055.html
Copyright © 2020-2023  润新知