热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ3468ASimpleProblemwithIntegers(线段树:区间add,区间查询)

POJ3468ASimpleProblemwithIntegers(线段树:区间add,区间查询)http:poj.orgproblem?id3468题意:De

POJ 3468 A Simple Problemwith Integers(线段树:区间add,区间查询)

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

题意:

Description

You have N integers, A1A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of AaAa+1, ... , Ab.

分析:

        基本模板题目。下面代码中如果一个节点同时有addv值和sum值,那么这个节点控制元素的和只算sum,因为addv值早就已经被加了一遍了。其实我后来觉得应该两者都考虑,这样更符合思维习惯。

下面给出另一个延迟更新版的线段树区间add和区间求和的模板。

//POJ 3468 区间add,区间查询
#include
#include
#include
using namespace std;

//每当有add加到i节点上,不会去更新i节点的sum.
//也就是说如果要查询区间[1,n]的sum值,既要考虑sum[i]的值,也要考虑add[i]的值
const int MAXN=100000+100;
typedef long long LL;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
int sum[MAXN*4];
int addv[MAXN*4];

//i节点收集下面节点的信息
void PushUp(int i,int num)
{
sum[i]=sum[i*2]+sum[i*2+1]+addv[i*2]*(num+1)/2+addv[i*2+1]*(num-(num+1)/2);
}

//将i节点的addv压下去,且更新sum[i]
void PushDown(int i,int num)
{
if(addv[i])
{
sum[i] += addv[i]*num;
addv[i*2]+=addv[i]; addv[i*2+1]+=addv[i];
addv[i]=0;
}
}

//sum[i]收集子节点的信息
//只在build线段树时会用
void PushUp(int i)
{
sum[i]=sum[i*2]+sum[i*2+1];
}
void build(int i,int l,int r)
{
addv[i]=0;
if(l==r)
{
scanf("%I64d",&sum[i]);
return ;
}
int m=(l+r)/2;
build(lson);
build(rson);
PushUp(i,r-l+1);
}

//给[ql,qr]区间加上add值
void update(int ql,int qr,int add,int i,int l,int r)
{
if(ql<=l&&r<=qr)
{
addv[i]+=add;
//sum[i] += (LL)add*(r-l+1);
return ;
}
PushDown(i,r-l+1);
int m=(l+r)/2;
if(ql<=m) update(ql,qr,add,lson);
if(m PushUp(i,r-l+1);
}

//查询[ql,qr]区间的sum值
int query(int ql,int qr,int i,int l,int r)
{
if(ql<=l&&r<=qr)
{
PushDown(i,r-l+1);
return sum[i];
}
PushDown(i,r-l+1);
int m=(l+r)/2;
int res=0;
if(ql<=m) res+=query(ql,qr,lson);
if(m return res;
}



AC代码:1797ms

//POJ 3468 区间add,区间查询
#include
#include
#include
using namespace std;

//每当有add加到i节点上,直接更新i节点的sum.
//也就是说如果要查询区间[1,n]的sum值,直接sum[1]即可,不用再去考虑1的addv[1]值.
const int MAXN=100000+100;
typedef long long LL;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
LL sum[MAXN*4];
LL addv[MAXN*4];
void PushDown(int i,int num)
{
if(addv[i])
{
sum[i*2] +=addv[i]*(num-(num/2));
sum[i*2+1] +=addv[i]*(num/2);
addv[i*2] +=addv[i];
addv[i*2+1]+=addv[i];
addv[i]=0;
}
}
void PushUp(int i)
{
sum[i]=sum[i*2]+sum[i*2+1];
}
void build(int i,int l,int r)
{
addv[i]=0;
if(l==r)
{
scanf("%I64d",&sum[i]);
return ;
}
int m=(l+r)/2;
build(lson);
build(rson);
PushUp(i);
}
void update(int ql,int qr,int add,int i,int l,int r)
{
if(ql<=l&&r<=qr)
{
addv[i]+=add;
sum[i] += (LL)add*(r-l+1);
return ;
}
PushDown(i,r-l+1);
int m=(l+r)/2;
if(ql<=m) update(ql,qr,add,lson);
if(m PushUp(i);
}
LL query(int ql,int qr,int i,int l,int r)
{
if(ql<=l&&r<=qr)
{
return sum[i];
}
PushDown(i,r-l+1);
int m=(l+r)/2;
LL res=0;
if(ql<=m) res+=query(ql,qr,lson);
if(m return res;
}
int main()
{
int n,q;
while(scanf("%d%d",&n,&q)==2&&n&&q)
{
build(1,1,n);
while(q--)
{
char str[10];
scanf("%s",str);
int x,y,z;
if(str[0]=='Q')
{
scanf("%d%d",&x,&y);
printf("%I64d\n",query(x,y,1,1,n));
}
else
{
scanf("%d%d%d",&x,&y,&z);
update(x,y,z,1,1,n);
}
}
}
return 0;
}





推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • fzu 1715 Ball and Box n个不同的求放到m个不同的盒子中方法的个数
    1715BallandBoxAccept:120Submit:288TimeLimit:1000mSecMemoryLimit:32768KBProblem ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
author-avatar
傅笑寒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有