zoukankan      html  css  js  c++  java
  • 在一段里同时增加某个数 然后在给定的区间里求和

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<math.h>
    using namespace std;
    #define N 110000
    #define lson rood<<1
    #define rson rood<<1|1
    int w[N];
    struct node
    {
        int l,r,mid,len;
        long long v,e;
    }a[N<<2];
    void q(int rood,int l,int r)
    {
        a[rood].l=l;a[rood].r=r;a[rood].mid=(r+l)/2;
        a[rood].e=0;a[rood].len=(r-l+1);
        if(l==r)
        {
            a[rood].v=w[l];
            return ;
        }
        q(lson,l,a[rood].mid);
        q(rson,a[rood].mid+1,r);
        a[rood].v=a[lson].v+a[rson].v;
    }
    void qq(int rood,int l,int r,int g)
    {
        a[rood].v+=(r-l+1)*g;
        if(a[rood].l==l&&a[rood].r==r)
        {
            a[rood].e+=g;
            return ;
        }
        if(a[rood].mid>=r) qq(lson,l,r,g);
        else if(a[rood].mid<l) qq(rson,l,r,g);
        else
        {
            qq(lson,l,a[rood].mid,g);
            qq(rson,a[rood].mid+1,r,g);
        }
    }
    void Q(int rood)
    {
        a[lson].v+=a[lson].len*a[rood].e;
        a[rson].v+=a[rson].len*a[rood].e;
        a[lson].e+=a[rood].e;
        a[rson].e+=a[rood].e;
        a[rood].e=0;
    }
    long long qqq(int rood,int l,int r)
    {
        if(a[rood].l==l&&a[rood].r==r)
            return a[rood].v;
        Q(rood);
        if(a[rood].mid>=r) return qqq(lson,l,r);
        else if(a[rood].mid<l) return qqq(rson,l,r);
        else
        {
            long long x=qqq(lson,l,a[rood].mid);
            long long  y=qqq(rson,a[rood].mid+1,r);
            return x+y;
        }
    }
    int main()
    {
        int n,m,e,f,g;
        char str[12];
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1;i<=n;i++)
                scanf("%d",&w[i]);
            q(1,1,n);
            while(m--)
            {
                scanf("%s%d%d",str,&e,&f);
                if(str[0]=='Q')
                {
                    printf("%lld
    ",qqq(1,e,f));
                    continue;
                }
                scanf("%d",&g);
                qq(1,e,f,g);
            }
        }
        return 0;
    }

    http://poj.org/problem?id=3468

  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/a719525932/p/5667222.html
Copyright © 2011-2022 走看看