zoukankan      html  css  js  c++  java
  • F

    Description

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

    "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 <stdio.h>
    #include <string.h>
    using namespace std;
    typedef long long LL;
    const int maxn = 100010;
    LL s[maxn],c[2][maxn];
    int n,m;
    void add(LL *c,int i,LL val)
    {
        while(i <= n)
        {
            c[i] += val; i += i&-i;
        }
    }
    LL sum(LL *c,int i,LL ret = 0)
    {
        while(i > 0)
       {
            ret += c[i];
            i -= i&-i;
        }
        return ret;
    }
    int main()
    {
        char cmd[4];
        LL x,y,z;
        while(~scanf("%d%d",&n,&m))
         {
            memset(c,0,sizeof c);
            for(int i = 1; i <= n; ++i)
            {
                scanf("%lld",s + i); s[i] += s[i-1];
            }
            while(m--)
              {
                scanf("%s",cmd);
                if(cmd[0] == 'C')
                {
                    scanf("%lld%lld%lld",&x,&y,&z);
                    add(c[0],x,z);
                    add(c[0],y+1,-z);
                    add(c[1],x,x*z);
                    add(c[1],y+1,-z*(y+1));
                } else
                {
                    scanf("%lld%lld",&x,&y);
                    printf("%lld ",s[y] - s[x-1] + (y+1)*sum(c[0],y) - sum(c[1],y) - x*sum(c[0],x-1) + sum(c[1],x-1));
                }
            }
        }
        return 0;
    }
     
  • 相关阅读:
    java8 Stream排序字段为空排序方法
    SpringBoot使用token简单鉴权的具体实现方法
    性能调优
    TestNG最简单的测试
    TestNG异常测试
    TestNG中如何执行测试
    TestNG的基本注解
    TestNG介绍
    TestNG 环境搭建
    python第四课笔记
  • 原文地址:https://www.cnblogs.com/441179572qqcom/p/5693232.html
Copyright © 2011-2022 走看看