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

http://poj.org/problem?id=3468

题意:

给出一串数,每次在一个区间内增加c,查询[a,b]时输出a、b之间的总和。

 

思路:

总结一下懒惰标记的用法吧。

比如要对一个区间范围内的数都要加c,在找到这个区间之后,本来它的孩子结点也是需要更新的,但是我们可以暂时不更新,如果到时候需要用到这些孩子结点的时候,我们再来更新。这个时候就要用到懒惰标记了,也就是add[o]=c,之后它的孩子结点更新时就只需要加上add[o]就可以了。

  1 #include<iostream>
  2 #include<string>
  3 #include<cstring>
  4 #include<cstdio>
  5 using namespace std;
  6 
  7 const int maxn = 100000 + 10;
  8 int n, m;
  9 
 10 long long add[maxn << 2];
 11 long long sum[maxn << 2];
 12 
 13 void PushDown(int o, int m)
 14 {
 15     if (add[o])
 16     {
 17         //传递懒惰标记
 18         add[o << 1] += add[o];
 19         add[o << 1 | 1] += add[o];
 20         //更新子节点的值
 21         sum[o << 1] += add[o] * (m - (m >> 1));
 22         sum[o << 1 | 1] += add[o] * (m >> 1);
 23         //出去懒惰标记
 24         add[o] = 0;
 25     }
 26 }
 27 
 28 void PushUp(int o)
 29 {
 30     sum[o] = sum[o << 1] + sum[o << 1 | 1];
 31 }
 32 
 33 void build(int L, int R, int o)
 34 {
 35     add[o] = 0;
 36     if (L == R)
 37     {
 38         scanf("%lld", &sum[o]);
 39         return;
 40     }
 41     int mid = (L + R) / 2;
 42     build(L, mid, 2 * o);
 43     build(mid + 1, R, 2 * o + 1);
 44     PushUp(o);
 45 }
 46 
 47 void update(int L, int R, int x, int l,int r,int o)
 48 {
 49     if (L <= l && R >= r)   //如果找到区间了,则不需要往下更新孩子结点了,等下次需要时再更新
 50     {
 51         add[o] += x;
 52         sum[o] += (r - l + 1)*x;
 53         return;
 54     }
 55     PushDown(o, r - l + 1);
 56     int mid = (l + r) / 2;
 57     if (L <= mid)
 58         update(L, R, x, l, mid, 2 * o);
 59     if (R > mid)
 60         update(L, R, x, mid + 1, r, 2 * o + 1);
 61     PushUp(o);
 62 }
 63 
 64 long long query(int L, int R, int l, int r, int o)
 65 {
 66     if (L <= l && R >= r)
 67         return sum[o];
 68     PushDown(o, r - l + 1);
 69     int mid = (l + r) / 2;
 70     long long ans = 0;
 71     if (L <= mid)
 72         ans += query(L, R, l, mid, 2 * o);
 73     if (R > mid)
 74         ans += query(L, R, mid + 1, r, 2 * o + 1);
 75     return ans;
 76 }
 77 
 78 
 79 int main()
 80 {
 81     //freopen("D:\\txt.txt", "r", stdin);
 82     while (~scanf("%d%d", &n, &m))
 83     {
 84         build(1, n, 1);
 85         char c[5];
 86         int x, y, z;
 87         while (m--)
 88         {
 89             scanf("%s", &c);
 90             if (c[0] == 'Q')
 91             {
 92                 scanf("%d%d", &x, &y);
 93                 printf("%lld\n", query(x, y, 1, n, 1));
 94             }
 95             else
 96             {
 97                 scanf("%d%d%d", &x, &y, &z);
 98                 update(x, y, z, 1, n, 1);
 99             }
100         }
101     }
102 }

 

转载于:https://www.cnblogs.com/zyb993963526/p/6561795.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 新浪url,PHP URL函数详解

php url函数:parse_url()parse_url(PHP 3, PHP 4, PHP 5)parse_url -- 解析 URL&#xff0c;归来其构成局部解释array parse_url ( string url )本函数解析一个 URL 并归来一个关系数组&#xff0c;包括在 URL 中揭示的各种构成局部。本函数不是用来检讨给定 URL 的合法性的&am…

完整的WebApplication JSF EJB JPA JAAS –第1部分

这篇文章将是迄今为止我博客中最大的一篇文章&#xff01; 我们将看到完整的Web应用程序。 最新的技术将完成此工作&#xff08;直到今天&#xff09;&#xff0c;但是我将给出一些提示以显示如何使本文适用于较旧的技术。 在本文的结尾&#xff0c;您将找到要下载的源代码。 您…

Ajax和JavaScript的区别

javascript是一种在浏览器端执行的脚本语言&#xff0c;Ajax是一种创建交互式网页应用的开发技术 &#xff0c;它是利用了一系列相关的技术其中就包括javascript。Javascript是由网景公司开发的一种脚本语言&#xff0c;它和sun公司的java语言是没有任何关系的&#xff0c;它们…

大一

以后准备开始ACM的题目啦转载于:https://www.cnblogs.com/Aiden-/p/6562038.html

概念验证:玩! 构架

我们正在开始一个新项目&#xff0c;我们必须选择Web框架。 我们的默认选择是grails&#xff0c;因为团队已经拥有使用它的经验&#xff0c;但是我决定给Play&#xff01; 和Scala有机会。 玩&#xff01; 有很多很酷的东西&#xff0c;在我的评估中&#xff0c;它得到了很多加…

ldap统一用户认证php,针对LDAP服务器进行身份认证

Symfony提供了不同的方法来配合LDAP服务器使用。Security组件提供&#xff1a;ldap user provider&#xff0c;使用的是form_login_ldap authentication provider&#xff0c;用于针对一台使用了表单登录的LDAP服务器。同所有其他user provider一样&#xff0c;它可以同任何aut…

每天CookBook之JavaScript-039

IIFE的使用<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>039</title> </head> <body></body> <script type"text/javascript"> (function () {var i 0;fu…

Day-6:创建计算字段

字段&#xff1a;基本上与列的意思相同&#xff0c;经常互换使用&#xff0c;计算字段是运行时在SELECT语句内创建的&#xff0c;不实际存在于数据库表中。 拼接字段&#xff1a;将值联结到一起构成单个值 SQL中的SELECT语句中可以使用或||操作符拼接&#xff0c;但mysql中必须…

使用Hibernate加载或保存图像-MySQL

本教程将引导您逐步了解如何使用Hibernate从数据库&#xff08; MySQL &#xff09;保存和加载图像。 要求 对于此示例项目&#xff0c;我们将使用&#xff1a; Eclipse IDE &#xff08;您可以使用自己喜欢的IDE&#xff09;&#xff1b; MySQL &#xff08;您可以使用任何…

javaweb回顾第四篇Servlet异常处理

前言&#xff1a;很多网站为了给用户很好的用户体验性&#xff0c;都会提供比较友好的异常界面&#xff0c;现在我们在来回顾一下Servlet中如何进行异常处理的。 1&#xff1a;声明式异常处理 什么是声明式&#xff1a;就是在web.xml中声明对各种异常的处理方法。 是通过<er…

java开发cs教程,日常运维(一)

w命令&#xff1a;用于查看系统负载、显示已经登陆系统的用户列表&#xff0c;并显示用户正在执行的指令等信息第一行从左面开始显示的信息依次为&#xff1a;时间&#xff0c;系统运行时间&#xff0c;登录用户数&#xff0c;平均负载。第二行开始以及下面所有的行&#xff0c…

coursera 《现代操作系统》 -- 第五周 同步机制(1)

临界区块&#xff08;Critical section&#xff09;指的是一个访问共用资源&#xff08;例如&#xff1a;共用设备或是共用存储器&#xff09;的程序片段&#xff0c;而这些共用资源有无法同时被多个线程访问的特性。&#xff08;不是字面意思的一个区域&#xff0c;是程序片段…

java.lang.NoClassDefFoundError:如何解决–第2部分

本文是我们的NoClassDefFoundError故障排除系列的第2部分。 看一下第1部分 。 它将重点介绍最简单的NoClassDefFoundError问题类型。 本文对于Java初学者来说是理想的选择&#xff0c;我强烈建议您自己编译并运行示例Java程序。 今后将使用以下书写格式&#xff0c;并为您提供&…

Android开发技术周报 Issue#34

教程 Google Develop for Android 系列 前几天在G上看到Google Developers站点&#xff0c;有一个Android系列的文章&#xff0c;分享到个人微博&#xff0c;周末闲来没事就学写了下&#xff0c;把它们简单的翻译了下&#xff0c;没想到一发不可收拾&#xff0c;六篇文章全部都…

php进度条插件,分享8款优秀的 jQuery 加载动画和进度条插件_jquery

加载动画和进度条在网站和 Web 应用中的使用非常流行。虽然网速越来越快&#xff0c;但是我们的网站越来越复杂&#xff0c;同时用户对网站的使用体验的要求也越来越高。在内容加载缓慢的时候&#xff0c;使用时尚的加载动画和进度条告诉用户还有内容正在加载是一种非常好的方式…

卷积神经网络(CNN)与特殊的卷积

各种卷积操作的可视化的显示形式&#xff1a;GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning1. fractionally-strided 卷积 如上图示&#xff0c;输入为 33 &#xff0c;想要卷积上采样成 55 的输出。需要…

JBoss AS 7:自定义登录模块

JBoss AS 7很整洁&#xff0c;但是仍然缺少文档&#xff08;错误消息没有那么有用&#xff09;。 这篇文章总结了如何创建自己的兼容JavaEE的登录模块&#xff0c;以对部署在JBoss AS上的Web应用程序的用户进行身份验证。 提供了一个工作的基本用户名密码模块。 为什么要使用Ja…

MySQL安装步骤及相关问题解决

1. 下载MySQL Server&#xff0c;网址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2. 点击MySQL5.5.21的安装文件&#xff0c;出现安装向导界面&#xff0c;单击“next”继续安装&#xff1a; 3. 选择接受协议&#xff0c;单击“next”继续安装&#xff1a; 4. 在出现选…

matlab的数学函数,matlab中常见数学函数的使用

matlab中常见数学函数的使用 MATLAB 基本知识 Matlab 的内部常数 pi 圆周率 exp(1) 自然对数的底数 e i 或 j 虚数单位 Inf 或 inf 无穷大 Matlab 的常用内部数学函数 指数函数 exp(x) 以 e 为底数 log(x) 自然对数&#xff0c;即以 e 为底数的对数 log10(x) 常用对数&#xff…

C++中 list与vector的区别

C中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C vector和list的区别 1.vector数据结构vector和数组类似&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变。因此能高效的进行随机存取&#xff0c;时间复杂度为o(1);但因为内…