线段树的 建立build(初始化+左右相等+两个递归+别忘了sum)+更新update(递归出口+更新delta+三向递归+修正当前节点的value)+查找query(如果左右相等+更新delta+三种递归)

#include<iostream>
using namespace std;#define L(root) ((root) << 1)
#define R(root) (((root) << 1) + 1)const int MAXN = 100001;
int numbers[MAXN];struct st {// 区间范围int left, right;// 更新值、区间总和long long delta, sum;
} st[MAXN * 4];// 建树代码基本不变
void build(int root, int l, int r) {st[root].left = l, st[root].right = r, st[root].delta = 0;if (l == r) {st[root].sum = numbers[l];return;}int m = l + ((r - l) >> 1);build(L(root), l, m);build(R(root), m + 1, r);st[root].sum = st[L(root)].sum + st[R(root)].sum;
}long long query(int root, int l, int r) {// 如查询区间恰等于节点区间,直接返回该区间总和即可if (st[root].left == l && st[root].right == r) {return st[root].sum;}// 否则需将当前区间的“缓冲”值更新下去并修正各节点区间的总和if (st[root].delta) {st[L(root)].delta += st[root].delta;st[R(root)].delta += st[root].delta;st[L(root)].sum += st[root].delta * (st[L(root)].right - st[L(root)].left + 1);st[R(root)].sum += st[root].delta * (st[R(root)].right - st[R(root)].left + 1);st[root].delta = 0;}int m = st[root].left + ((st[root].right - st[root].left) >> 1);if (r <= m) {return query(L(root), l, r);} else if (l > m) {return query(R(root), l, r);} else {return query(L(root), l, m) + query(R(root), m + 1, r);}
}void update(int root, int l, int r, long long v) {// 如变更区间恰等于节点区间,只修正当前节点区间即可if (st[root].left == l && st[root].right == r) {st[root].delta += v;st[root].sum += v * (r - l + 1);return;}// 否则需向下修正相关节点区间if (st[root].delta) {st[L(root)].delta += st[root].delta;st[R(root)].delta += st[root].delta;st[L(root)].sum += st[root].delta * (st[L(root)].right - st[L(root)].left + 1);st[R(root)].sum += st[root].delta * (st[R(root)].right - st[R(root)].left + 1);st[root].delta = 0;}int m = st[root].left + ((st[root].right - st[root].left) >> 1);if (r <= m) {update(L(root), l, r, v);} else if (l > m) {update(R(root), l, r, v);} else {update(L(root), l, m, v);update(R(root), m + 1, r, v);}// 同时一定要记得修正当前节点区间的总和st[root].sum = st[L(root)].sum + st[R(root)].sum;
}int main() {int N, Q;while (cin >>N >> Q) {for (int i = 1; i <= N; ++i) {cin >> numbers[i];}build(1, 1, N);char cmd;int l, r;long long v;while (Q--) {cin >>cmd;cin >>l>>r;switch (cmd) {case 'Q':cout<<query(1, l, r)<<endl;break;case 'C':cin >> v;if (v) {update(1, l, r, v);}break;}}}return 0;
}

转载于:https://www.cnblogs.com/lipenglin/p/4395743.html

poj 3468 线段树相关推荐

  1. POJ 3468 线段树+lazy标记

    lazy标记   Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u  Submit S ...

  2. A Simple Problem with Integers POJ - 3468 (线段树)

    思路:线段树,区间更新,区间查找 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #inc ...

  3. POJ 3264 线段树

    题意 传送门 POJ 3264 题解 线段树维护区间的最大值和最小值即可. #include <cstdio> #include <cstring> #include < ...

  4. poj(2325)线段树

    这里介绍另外一种解法,此题可以用线段树,可以用树状数组 其实这题求的都是下面的和左面的,线段树这种数组结构刚好可以满足,为什么呢?这里稍微解释下吧,也有助于以后的复习 看上面这个图,[1,1],[2, ...

  5. POJ - 2528 线段树+离散化

    其实很早就在白书上的常用技巧上 看到离散化的操作,但是之前一直没遇到过需要离散化的题目(应该是我太菜的缘故),所以一直也没怎么重视,下面说说这道题目的考点,也就是离散化. 什么是离散化呢?请先自行百度 ...

  6. poj 2777(线段树+区间染色)

    解题思路:这道题利用了线段树+位运算的思想,由于颜色的种类只有30种,所以int可以存下来,所以我们在线段树的节点里面加上status的状态信息,表示这段区间内的颜色信息,而且我们可以知道,父节点的s ...

  7. poj 2352 线段树

    注意到题目中给的y是递增的,那个y没什么用,直接线段树维护一段1,x的区间. #include<string> #include<iostream> #include<c ...

  8. poj 2528 线段树离散化+染色

    题目链接 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 2645 ...

  9. poj 3468 Splay 树

    大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里  http://blog.csdn.n ...

最新文章

  1. 计算机网络训练参考文献,学生实践论文,关于开放教育过程中计算机网络技术专业学生实践能力的培养相关参考文献资料-免费论文范文...
  2. python3.6安装opencv-python3.6.5安装opencv3
  3. 【转】谈谈三层架构中MODEL的作用
  4. GDCM:gdcm::StreamImageReader的测试程序
  5. php循环输出标题,php-如何通过循环在同一标题下分组数据
  6. C++ STL 四种智能指针
  7. android彻底关闭应用程序方法
  8. 一步一步写算法(之 最大公约数、最小公倍数)
  9. 前端周刊第58期:送你 3 道面试题
  10. ENVI5.3.1使用Landsat 8影像进行灰度分割(密度分割)
  11. CentOS6 图形界面(gnome)安装(转)
  12. 是否可以加唯一约束 有空_一篇文章可以学会保温杯的三维设计吗?真可以
  13. 公开课丨苏杰新著来袭,十年之后再谈人人都是产品经理!
  14. 批量/去掉office 2010 Word中标题前的黑点
  15. 洛谷P3227 切糕
  16. Battleship!
  17. [dlang](4)自定义的mysql orm工具
  18. 重庆师范大学第一届ACM选拔赛
  19. Sklearn KDTree 的使用
  20. 头牌知产介绍减肥药商标注册属于哪一类?

热门文章

  1. NYOJ 527 AC_mm玩dota
  2. 怎么看台式计算机是几位的,怎么查看自己电脑型号
  3. linux内核网络协议栈--linux bridge(十九)
  4. java一定时间间隔的定时任务_Java 定时任务---Timer
  5. OPENSSL_Uplink(0098E000,07): no OPENSSL_Applink 错误分析
  6. error: mod_deflate has been requested but can not be built due to prerequisite failures
  7. linux下一键安装jdk1.7.0_79和tomcat7
  8. systemd的程序自启动脚本编写
  9. jQuery的使用及关于框架造型(转)
  10. 在loadrunner中使用winsocket协议编写脚步三部曲