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;
    }
     
  • 相关阅读:
    1、Spring Cloud Alibaba 新一代微服务解决方案
    springboot整合activemq(1)
    11.springboot+mybatis+dubbo+zookepper
    多线程的使用
    Spring 框架用到的 9 个设计模式汇总
    docker数据卷与数据卷容器
    4.GitHub的使用
    Spring Cloud中Hystrix、Ribbon及Feign的熔断关系
    git如何正确回滚代码
    1)Linux学习笔记:crontab命令
  • 原文地址:https://www.cnblogs.com/441179572qqcom/p/5693232.html
Copyright © 2011-2022 走看看