链接:https://vjudge.net/problem/POJ-3468

题意:

给定n个树,存在区间更新和区间查找。

思路:

区间更新,延迟标记。

延迟标价某个节点表示,下面的节点存在延迟的值未更新,下一次查找到或使用时更新。

减小时间消耗。

代码:

#include <iostream>
#include <memory.h>
#include <vector>
#include <map>
#include <algorithm>using namespace std;typedef long long LL;const int MAXN = 1e5 + 10;LL a[MAXN];
LL segment[MAXN * 4];
LL add[MAXN * 4];void Push_down(int root, int l, int r)
{//线段树区间更新延迟更新操作if (add[root])//表示有延迟标记{//将上一层的标记移至下一层add[root << 1] += add[root];add[root << 1 | 1] += add[root];int mid = (l + r) >> 1;segment[root << 1] += add[root] * (mid - l + 1);//将下一层的线段树值更新segment[root << 1 | 1] += add[root] * (r - mid);add[root] = 0;//本曾延迟更新完毕,清楚本曾更新。}
}void Build_tree(int root, int l, int r)
{if (l == r){segment[root] = a[l];return;}int next_node = root << 1;int mid = (l + r) / 2;Build_tree(next_node, l, mid);Build_tree(next_node + 1, mid + 1, r);segment[root] = segment[next_node] + segment[next_node + 1];
}void Update(int root, int l, int r, int ql, int qr, int c)
{if (ql > r || qr < l)return;if (ql <= l && r <= qr){segment[root] += c * (r - l + 1);//更新查找区间add[root] += c;//延迟更新标记}else{Push_down(root, l, r);//更新此点的延迟标记int mid = (l + r) / 2;Update(root << 1, l, mid, ql, qr, c);Update(root << 1 | 1, mid + 1, r, ql, qr, c);segment[root] = segment[root << 1] + segment[root << 1 | 1];}
}LL Query(int root, int l, int r, int ql, int qr)
{if (ql > r || qr < l)return 0LL;if (ql <= l && r <= qr)return segment[root];Push_down(root, l, r);int mid = (l + r) / 2;LL res = 0;res += Query(root << 1, l, mid, ql, qr);res += Query(root << 1 | 1, mid + 1, r, ql, qr);return res;
}int main()
{int n, q;scanf("%d%d", &n, &q);for (int i = 1;i <= n;i++)cin >> a[i];Build_tree(1, 1, n);char op[10];int a, b, c;while (q--){scanf("%s", op);if (op[0] == 'Q'){scanf("%d%d", &a, &b);printf("%lld\n", Query(1, 1, n, a, b));}else{scanf("%d%d%d", &a, &b, &c);Update(1, 1, n, a, b, c);}}return 0;
}

  

转载于:https://www.cnblogs.com/YDDDD/p/10425755.html

POJ-3468-A Simple Problem with integers相关推荐

  1. 【线段树】【模板】讲解 + 例题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(区间加值) ...

  2. poj 3468 A Simple Problem with Integers(线段树区区)

    题目链接:  http://poj.org/problem?id=3468 题目大意:  给出N个数,和M次查询 C a b c  区间[a,b]的值都加上c Q a b     查询区间[a,b]值 ...

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

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

  4. POJ 3468 A Simple Problem with Integers

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

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

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

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

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

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

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

  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传递的线段树题目,这题和一般题目不同的地方在于,它的每次操作不是简单的覆盖线段,而是累加.记得第一次写的时候纠结了好 ...

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

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

最新文章

  1. ZZNU 1993: cots' friends
  2. 德国小哥1人“黑掉”谷歌地图:99部手机就能造成交通拥堵
  3. ElasticSearch 2 (21) - 语言处理系列之单词识别
  4. max's java road
  5. 如果使用StateServer或SQLServer,会遇到的问题。。。。
  6. 怎样在CSDN的博客里面显示上传的图片,教你一招
  7. P1165 日志分析
  8. Tensorflow2下载与安装
  9. 在小公司待了3年后,我废了
  10. 【iOS】Web Color 的 Swift 实现
  11. vb导出mysql字段名_VB获取数据库字段名
  12. Spring源码下载编译全过程!超详细的步骤!!!
  13. codeblock的汉化过程
  14. 超级无敌diao炸天的手写堆
  15. 关于英语学习和字幕的那点事儿
  16. PWM 脉冲宽度调制
  17. datagridview 获取选中行号 数据,判断是不是选中了一行
  18. EXCEL数组公式,求多条件下的中位数的实现方法和注意点
  19. 无法在web服务器上启动调试。未能启动asp.net调试。在不调试的情况下启动项目也许能获得更多信息。
  20. 2019 SUST暑期集训题解(计算几何(二))

热门文章

  1. Flink CDC 系列 - Flink MongoDB CDC 在 XTransfer 的生产实践
  2. 其实你的领导也有中年危机
  3. python一行输出_#python版一行内容分行输出
  4. 全国计算机一级考试难度高吗,计算机等级考试分几级 考试难度大不大
  5. java怎么根据编号修改数据类型_Java中怎么根据不同的输入数据类型调用不同的方法呢?...
  6. mysql 1236错误_MySQL主主同步环境出现1236错误
  7. FR两个相同字符如何提取第二个字符后内容
  8. 网络摄像头ip php,C#实现IP摄像头的方法
  9. 大数据平台搭建_【他山之石】自研搭建Hadoop数据科学开发环境,促进大数据平台建设降本增效...
  10. 在python中使用sort_详解python中sort排序使用