zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    hdu1561--树形dp<依赖背包>
    hdu--1520--树形dp<写起来就是深搜啊>-<滚动数组优化>
    hdu--1595-另类最短路
    hdu--1599--最小环<会加深你对floyd的理解>
    hdu--1851--尼姆博弈&&巴什博弈<也有人用了sg可惜我还不懂>
    hdu--4920--原来一直写了速度慢的矩阵乘法
    hdu--4912--终于解脱了
    hdu--4947--我太天真了
    hdu--2576--高中数学..
    hdu--2579--第二次与女孩的约会
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755055.html
Copyright © 2011-2022 走看看