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

题意分析

注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大坑。

代码总览

#include <cstdio>
#include <cstring>
#include <algorithm>
#define nmax 200000
using namespace std;
struct Tree{
int l,r;
long long val;
long long lazy;
int mid(){
return (l+r)>>1;
}
};
Tree tree[nmax<<2];
long long num[nmax];
void PushUp(int rt)
{
tree[rt].val = tree[rt<<1].val + tree[rt<<1|1].val;
}
void PushDown(int rt)
{
if(tree[rt].lazy){
tree[rt<<1].lazy += tree[rt].lazy;
tree[rt<<1|1].lazy += tree[rt].lazy;
tree[rt<<1].val += tree[rt].lazy * (tree[rt<<1].r - tree[rt<<1].l +1) ;
tree[rt<<1|1].val +=tree[rt].lazy * (tree[rt<<1|1].r - tree[rt<<1|1].l +1);
tree[rt].lazy = 0;
}
}
void Build(int l, int r, int rt)
{
tree[rt].l = l; tree[rt].r = r;
tree[rt].val = tree[rt].lazy = 0;
if(l == r){
tree[rt].val = num[l];
return;
}
Build(l,tree[rt].mid(),rt<<1);
Build(tree[rt].mid()+1,r,rt<<1|1);
PushUp(rt);
}
void UpdatePoint(long long val, int pos, int rt)
{
if(tree[rt].l == tree[rt].r){
tree[rt].val+=val;
return;
}
PushDown(rt);
if(pos<= tree[rt].mid()) UpdatePoint(val,pos,rt<<1);
else UpdatePoint(val,pos,rt<<1|1);
PushUp(rt);
}
void UpdateInterval(long long val, int l, int r, int rt)
{
if(tree[rt].l >r || tree[rt].r < l) return;
if(tree[rt].l >= l && tree[rt].r <= r){
tree[rt].val += val * (tree[rt].r - tree[rt].l + 1);
tree[rt].lazy += val;
return;
}
PushDown(rt);
UpdateInterval(val,l,r,rt<<1) ;
UpdateInterval(val,l,r,rt<<1|1);
PushUp(rt);
}
long long Query(int l,int r,int rt)
{
if(l>tree[rt].r || r<tree[rt].l) return 0;
PushDown(rt);
if(l <= tree[rt].l && tree[rt].r <= r) return tree[rt].val;
else return Query(l,r,rt<<1) + Query(l,r,rt<<1|1); }
int N,Q,a,b;
long long c;
char op;
int main()
{
//freopen("in3468.txt","r",stdin);
while(scanf("%d %d",&N,&Q) != EOF){
for(int i = 1;i<=N;++i) scanf("%I64d",&num[i]);
Build(1,N,1);
for(int i = 0;i<Q;++i){
scanf(" %c %d %d",&op,&a,&b);
if(op == 'C'){
scanf("%I64d",&c);
UpdateInterval(c,a,b,1);
}else{
printf("%I64d\n",Query(a,b,1));
}
}
}
return 0;
}

最新文章

  1. jquery EasyUI
  2. HDU 1165 Eddy&#39;s research II (找规律)
  3. UIPageControl页控制器
  4. CUBRID学习笔记 21 查看主键外键索引
  5. Asp.net操作Excel(终极方法NPOI)(转)
  6. Android 签名(8)签名前用Zipalign简单优化
  7. Crazyflie笔记五: CRTP 实时通信协议(一)(转)
  8. 简单总结下关于blob的图片上传
  9. 201521123110 《Java程序设计》第9周学习总结
  10. Fiddler系列教程3:使用Fiddler录制Jmeter性能测试脚本
  11. Mac 终端 shell 公钥失效解决办法
  12. FFmpeg源代码简单分析:avcodec_encode_video()
  13. 结构体:探析C#文件方式读写结构体
  14. 基于vue开发的element-ui树形控件报错问题解决
  15. [.net core学习] .net core中的MD5CryptoServiceProvider取代方法
  16. 添加PMD插件扫描潜在的bug
  17. Java使用reids,以及redis与shiro集成
  18. JavaScript------生成Guid方法
  19. django自带权限机制
  20. android应用程序monkey压力测试(模拟器或真机)

热门文章

  1. arduino蜂鸣器的使用
  2. Django——POST请求及Action触发事件
  3. Hbase 教程-安装
  4. Spark任务执行期间写临时文件报错导致失败
  5. Cuteftp连接虚拟机Centos7
  6. 如何开发一个 PyCharm 插件
  7. 第17次Scrum会议(10/29)【欢迎来怼】
  8. 冲刺ing-7
  9. Codeforces Round #272 (Div. 2) E. Dreamoon and Strings dp
  10. lintcode-480-二叉树的所有路径