题目大意:

有N,M两个数

Q 表示查询, 后面两个数a b,表示查询从a 到b计算它们的和

C 表示增加   后面三个数a,b,c 表示从a开始,一直到b,每个数都增加c



除了查询要进行输出,增加不要输出

#include<iostream>
using namespace std;
#define LL(x)((x)<<1)
#define RR(x)((x)<<1|1)
struct_Seg_Tree{
   int left,right;
   long long sum;
   int add;
   int calmid(){
       return (left+right)/2;
   }
   int caldis(){
       return right-left+1;
   }
}tt[1000000];
int val[1000002];

long long build(int l,int r,int idx){
   tt[idx].left=l;
   tt[idx].right=r;
   tt[idx].add=0;
   if(l==r){
      return tt[idx].sum=val[l];
   }
   return tt[idx].sum=build(l,mid,LL(idx)+build(mid+1,r,RR(idx)));
}     

void update(int l,int r,int add,int idx){
   if(l<=tt[idx].left&&r>=tt[idx].right){
       tt[idx].add+=add;
       tt[idx].sum+=(long long)tt[idx].caldis()*add;//通过乘以后来添加的数
       return ;
   }
   if(tt[idx].add){
       tt[LL(idx).sum]+=(long long)tt[LL(idx)].caldis()*tt[idx].add;
       tt[RR(idx).sum]++(long long)tt[RR(idx)].caldis()*tt[idx].add;
       tt[LL(idx)].add+=tt[idx].add;
       tt[RR(idx)].add+=tt[idx].add;
       tt[idx].add=0; 

   }
   int mid=tt[idx].calmid();
   if(l<=mid) update(l,r,add,LL(idx));
   if(mid<r) update(l,r,add,RR(idx));
   tt[idx].sum = tt[LL(idx)].sum + tt[RR(idx)].sum;
}

long long query(int l,int r,int idx){
     if(l==tt[idx].left&&r==tt[idx].right){
        return tt[idx].sum;
     }
     if(tt[idx].add){
        tt[LL(idx)].sum += (long long )tt[LL(idx)].caldis() * tt[idx].add;
		tt[RR(idx)].sum += (long long)tt[RR(idx)].caldis() * tt[idx].add;
		tt[LL(idx)].add += tt[idx].add;
		tt[RR(idx)].add += tt[idx].add;
		tt[idx].add = 0;
     }
     int mid=tt[idx].calmid();
     if(r<=mid){
        return query(l,r,LL(idx));
     } else if(mid<1){
         return query(l,r,RR(idx));
     } else{
         return query(l,mid,LL(idx)+query(mid+1,r,RR(idx));
     }
}

int main(){
   int n,m;
   while(scanf("%d %d",&n,&m)==2){
       for(int i=1;i<=n;i++)
               scanf("%d",&val[i]);
       build(1,n,1);
       while(m--){
           char com[2];
           scanf("%s",com);
           if(com[0]=='Q'){
              int a,b;
              scanf("%d %d",&a,&b);
              pirntf("lld\n",query(a,b,1));
           }else{
              int a,b,c;
              scanf("%d %d %d",&a,&b,&c);
              update(a,b,c,1);
           }
       }
   }
}

PKU 3468 A Simple Problem with Integers的更多相关文章

  1. POJ 3468 A Simple Problem with Integers(分块入门)

    题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit ...

  2. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  3. POJ 3468 A Simple Problem with Integers(线段树功能:区间加减区间求和)

    题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit ...

  4. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  5. 线段树(成段更新) POJ 3468 A Simple Problem with Integers

    题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...

  6. poj 3468 A Simple Problem with Integers(线段树+区间更新+区间求和)

    题目链接:id=3468http://">http://poj.org/problem? id=3468 A Simple Problem with Integers Time Lim ...

  7. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  8. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  9. poj 3468 A Simple Problem with Integers 线段树区间更新

    id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072 ...

随机推荐

  1. Zookeeper和Chubby【分布式协调系统】

    前言(对于协调系统来说其客户端往往是分布式集群) 大规模分布式系统需要解决各种类型的协调需求: 当集群中有新的进程或服务器加入时,如何探测到它的加入?如何能够自动获取配置参数? 当配置信息被某个进程或 ...

  2. 关于Node.js中HTTP请求返回数据需要JSON解析的问题

    在编写项目过程中,需要用到实时数据的推送需求, 所以首先想到了NodeJS的websocket模块 在网上找了一个聊天室的例子  然后将其改为自己需求的推送 其中遇到的问题 返回数据问题  :   由 ...

  3. CSharpGL(48)用ShadowVolume画模型的影子

    CSharpGL(48)用ShadowVolume画模型的影子 在Per-Fragment Operations & Tests阶段,有一个步骤是模版测试(Stencil Test).依靠这一 ...

  4. Bootstrap3 排版-改变大小写

    通过这几个类可以改变文本的大小写. <p class="text-lowercase">Lowercased text.</p> <p class=& ...

  5. 浅谈机器人控制与仿真设计----RDS和ROS

    机器人控制.仿真或实验,主要由三个部分组成,机器人.环境和算法. 当然各部分又包含很多子部分和功能,这里主要以仿真为主,为了使得仿真结果能够直接应用到实际机器人上,这里分别以RDS和ROS对比介绍.h ...

  6. Gazebo機器人仿真學習探索筆記(六)工具和实用程序

    Gazebo附带了许多工具和实用程序. 这些教程说明了这些可用的工具,以及如何使用它们. 主要有: 1 记录和播放 2 日志过滤 3 应用力/扭矩 4 HDF5数据集 官网介绍通俗具体,非常容易,请参 ...

  7. activiti 多实例任务

    1.1.1. 前言 个人,那么当5个人都投票的时候大概分为如下几种: 1.部门所有人都去投票,当所有人都投票完成的时候,这个节点结束,流程运转到下一个节点.(所有的人都需要投票) 2.部门所有人都去投 ...

  8. Cocos2D与SpriteBuilder的问题在哪提问

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道Cocos2D的教程中文版的非常少,注意我没有说Coc ...

  9. [django] 利用多线程增加异步任务

    看到django异步大家的反应应该是celery这种消息队列组件,现在用的最多的最推荐的也是这种方式.然而我这需求就是请求来了,执行一个小程序,但是又不能确定这个小程序啥时候执行完,响应又要及时,丢给 ...

  10. FFmpeg源代码简单分析:avcodec_open2()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...