题目链接:  http://poj.org/problem?id=3468

题目大意:  给出N个数,和M次查询

C a b c  区间[a,b]的值都加上c

Q a b     查询区间[a,b]值的和

解题思路:  线段树区间lazy延迟更新,每次插入区间标记lazy

下次再操作此区间时用lazy更新下面的子树

每个结点存储值是区间的和

更新和查询的时间复杂度都是O(logN)

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 201000
#define MID(a,b) (a+b)>>1
#define L(a) a<<1
#define R(a) (a<<1|1)
typedef struct{int left,right;long long int sum,add;
}Node;Node Tree[MAX<<2]={0};
long long int num[MAX];void Build(long long int t,int l,int r)             //以1为根节点建立线段树[l,r]
{Tree[t].left=l,Tree[t].right=r;if(Tree[t].left==Tree[t].right){Tree[t].sum=num[Tree[t].right];Tree[t].add=0;return ;}int mid=MID(Tree[t].left,Tree[t].right);Build(L(t),l,mid);Build(R(t),mid+1,r);Tree[t].sum=Tree[L(t)].sum+Tree[R(t)].sum;
}void Insert(long long int t,int l,int r,long long int m)   //向区间[l,r]插入m
{if(Tree[t].left==l&&Tree[t].right==r){Tree[t].sum+=(Tree[t].right-Tree[t].left+1)*m;Tree[t].add+=m;return ;}if(Tree[t].add!=0)                   //无论是插入还是查询都要更新lazy{Tree[L(t)].sum+=(Tree[L(t)].right-Tree[L(t)].left+1)*Tree[t].add;Tree[R(t)].sum+=(Tree[R(t)].right-Tree[R(t)].left+1)*Tree[t].add;Tree[L(t)].add+=Tree[t].add;Tree[R(t)].add+=Tree[t].add;Tree[t].add=0;}int mid=MID(Tree[t].left,Tree[t].right);if(l>mid){Insert(R(t),l,r,m);}else if(r<=mid){Insert(L(t),l,r,m);}else{Insert(L(t),l,mid,m);Insert(R(t),mid+1,r,m);}Tree[t].sum=Tree[L(t)].sum+Tree[R(t)].sum;
}long long int Query(long long int t,int l,int r)     //查询区间[a,b]
{if(Tree[t].left==l&&Tree[t].right==r){return Tree[t].sum;}if(Tree[t].add!=0)                 //lazy更新{Tree[L(t)].sum+=(Tree[L(t)].right-Tree[L(t)].left+1)*Tree[t].add;Tree[R(t)].sum+=(Tree[R(t)].right-Tree[R(t)].left+1)*Tree[t].add;Tree[L(t)].add+=Tree[t].add;Tree[R(t)].add+=Tree[t].add;Tree[t].add=0;}int mid=MID(Tree[t].left,Tree[t].right);if(l>mid){return Query(R(t),l,r);}else if(r<=mid){return Query(L(t),l,r);}else{return Query(L(t),l,mid)+Query(R(t),mid+1,r);}Tree[t].sum=Tree[L(t)].sum+Tree[R(t)].sum;   //更新结点: 结点的值=左子树+右子树
}int main()
{char ch;int n,a,b,c;long long int i,m;scanf("%d%lld",&n,&m);for(i=1;i<=n;i++)         //初始化输入scanf("%lld",&num[i]);Build(1,1,n);for(i=1;i<=m;i++){getchar();scanf("%c",&ch);if(ch=='C'){scanf("%d%d%d",&a,&b,&c);Insert(1,a,b,c);            //区间[a,b]都加上c}else{scanf("%d%d",&a,&b);printf("%lld\n",Query(1,a,b));  //查询区间[a,b]的和}}return 0;
}

注:原创文章,转载请注明出处

poj 3468 A Simple Problem with Integers(线段树区区)相关推荐

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

    题目链接 这个真费劲...其实我也不懂 为什么...大体思想是,如果把区间更新了,开始的时候只把用懒惰标记标记那个区间,而不更新底层元素,而如果查询的时候顺带着把lz标记给消除...多敲几遍,多调试一 ...

  2. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  3. POJ 3468 A Simple Problem with Integers

    分析:这题wa了好多次(看了下discuss好多人也是这样,好题~).一处是sum值会超int32,要用int64.还有一处是toadd要累加,我不知道是受上一题影响还是怎的..pushdown的时候 ...

  4. POJ 3468 A Simple Problem with Integers (1)

    POJ_3468(1) 在消化了PPT上思想之后,又重新做了一下这个题目. 不妨将原数组的元素记作a[i],然后我们用堆建立两棵线段树,一棵的原数组为x[i](x[i]=a[i]-a[i-1],即原数 ...

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

    http://poj.org/problem?id=3468 题意: 给出一串数,每次在一个区间内增加c,查询[a,b]时输出a.b之间的总和. 思路: 总结一下懒惰标记的用法吧. 比如要对一个区间范 ...

  6. POJ - 3468 A Simple Problem with Integers(分块)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次操作,每次操作分为两种情况: C l r d:区间 [ l , r ] 内的数字都加上 d Q l r :查询 [ l , r ...

  7. poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)

    1 /* 2 树状数组第三种模板(改段求段)不解释! 不明白的点这里:here! 3 */ 4 #include<iostream> 5 #include<cstring> 6 ...

  8. poj 3243:A Simple Problem with Integers

    3243:A Simple Problem with Integers 查看 提交 统计 提示 提问 总时间限制:  5000ms  单个测试点时间限制:  2000ms  内存限制:  131072 ...

  9. 线段树专辑—— pku 3468 A Simple Problem with Integers

    http://poj.org/problem?id=3468 典型的一道基于lazy传递的线段树题目,这题和一般题目不同的地方在于,它的每次操作不是简单的覆盖线段,而是累加.记得第一次写的时候纠结了好 ...

最新文章

  1. FZU 2150 Fire Game bfs
  2. 利用shell脚本监控网站状态
  3. 测试Live Writer 发表博客
  4. mysql fetch rows_差异mysql_fetch_array()和mysql_fetch_rows()函数_mysql
  5. Halcon 学习总结——仿射变换
  6. asp 检测更改后缀的图片_微信不能发送25M以上视频?一键修改后缀名,就能立马发送...
  7. Jmeter中Websocket协议支持包的使用 (转)
  8. CMake下载 (大全?)(建议配合迅雷使用)(盲下)
  9. 阿里天池大数据竞赛(杂)
  10. 0901 - 虽已马不停蹄,无奈时光飞逝
  11. C中struct的函数的实现
  12. 牛客网赛码网 输入输出格式 pythonC++
  13. dede获取顶级栏目
  14. @Value取不到值的原因
  15. Java集合(超详细-含源码)
  16. Ubuntu高分屏下Matlab工具栏字体过小
  17. Win10无法搜索应用解决
  18. python 中/ 与 //的作用、用法
  19. 在ASP.NET中使用ListView控件对数据进行显示、分页和排序
  20. html5制作八卦图,使用HTML+CSS画太极八卦图

热门文章

  1. K8s Pod 钩子生命周期
  2. java如何解决高并发问题_java怎么处理高并发?
  3. RabbitMQ单个发布确认
  4. Spring5 版本新特性简述
  5. RocketMQ消息支持的模式-消息异步发送
  6. springboot约定优于配置的体现
  7. 用户操作-登录流程分析
  8. 常用的分布式事务解决方案介绍
  9. java抛异常 代替返回_请问业务层方法是抛出一个异常好还是返回一个结果更好...
  10. Versions maven plugin 修改版本