zoukankan      html  css  js  c++  java
  • Simple Problem with Integers (线段树更新懒惰值+区间和)

    给出了一个序列,你需要处理如下两种询问。

    "C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。

    "Q a b" 询问[a, b]区间中所有值的和。

    Input

    第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000.

    第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。

    接下来Q行询问,格式如题目描述。

    Output

    对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。

    Sample Input

    10 5
    1 2 3 4 5 6 7 8 9 10
    Q 4 4
    Q 1 10
    Q 2 4
    C 3 6 3
    Q 2 4

    Sample Output

    4
    55
    9
    15
    #include <iostream>
    using namespace std;
    const int N = 5*1e5+5;
    #define ls now<<1
    #define rs now<<1|1
    #define lli long long
    #define ok return 0;
    #define TLE std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    typedef struct node
    {
        lli val,lazy,l,r,mx,mn;
    }node;
    node dp[N<<2];
    int a[N];
    void pushup(int now) {dp[now].val = dp[ls].val+dp[rs].val;return ;}
    void build(int now,int l,int r)
    {
        dp[now].l=l;dp[now].r=r;dp[now].lazy=0;dp[now].val=0;
        if(l==r) {cin>>dp[now].val;return ;}
        int mid = (r+l)>>1;
        //cout<<"mid=====      " << mid <<endl;
        build(ls,l,mid);
        build(rs,mid+1,r);
        pushup(now);
    }
    void pushdown(int now)
    {
        if(dp[now].lazy)
        {
            dp[ls].val += dp[now].lazy*(dp[ls].r-dp[ls].l+1);
            dp[rs].val += dp[now].lazy*(dp[rs].r-dp[rs].l+1);
            dp[ls].lazy += dp[now].lazy;
            dp[rs].lazy += dp[now].lazy;
            dp[now].lazy = 0;
        }
    }
    lli query(int now,int l,int r)
    {
        if(dp[now].l>=l && dp[now].r<=r)
            {/*cout<<"+++++"<<endl;*/return dp[now].val;}
        pushdown(now);
        lli mid = ( dp[now].l+dp[now].r )>>1;
        long long cnt=0;
        if(l<=mid)
            cnt+=query(ls,l,r);
        if(r>mid)
            cnt+=query(rs,l,r);
        return cnt;
    }
    void updata(int now,int l,int r,lli k)
    {
        if(dp[now].l>=l && dp[now].r<=r)
        {
            dp[now].lazy+=k;
            dp[now].val+=(dp[now].r-dp[now].l+1)*k;
            return ;
        }
        pushdown(now);
        int mid = ( dp[now].l+dp[now].r )>>1;
        if(l<=mid) updata(ls,l,r,k);
        if(r>mid)  updata(rs,l,r,k);
        pushup(now);
    
    }
    int main()
    {
        TLE;
        lli n,m,lll,rrr,k;
        cin>>n>>m;
        //for(int i=1;i<=n;i++) cin>>a[i];
        build(1,1,n);
        string str;
        for(int i=0;i<m;i++)
        {
            cin>>str;
            if(str[0]=='Q')
            {
                cin>>lll>>rrr;
                cout<<query(1,lll,rrr)<<endl;
            }
            else
            {
                cin>>lll>>rrr>>k;
                updata(1,lll,rrr,k);
    
            }
        }
        ok;
    }
    所遇皆星河
  • 相关阅读:
    算法实践--最长公共子序列(Longest Common Subsquence)
    算法实践--最长递增子序列(Longest Increasing Subsquence)
    googletest--Death Test和Exception Test
    googletest--测试控制
    googletest--Test Fixture
    googletest基本测试宏
    使用googletest进行C++单元测试(Netbeans为例)
    Boost--optional
    Boost--any
    Boost--variant (C++中的union)
  • 原文地址:https://www.cnblogs.com/Shallow-dream/p/11470041.html
Copyright © 2011-2022 走看看