POJ - 3468 线段树单点查询,单点修改区间查询,区间修改模板(求和)
题意:
给定一个数字n,表示这段区间的总长度。然后输入n个数,然后输入q,然后输入a,b,表示查询a,b,区间和,或者输入c 再输入三个数字a,b,c,更改a,b区间为c
思路:
线段树首先就是递归建树,可以从左子树开始,将数据输入到叶子节点上。当左区间等于右区间的时候就是叶子节点。在回溯的时候,父亲节点的值根据左右儿子得出值。
区间修改的时候需要用到一个懒惰标记,当前走到的区间如果完全被需要修改的区间包含的时候,只需更改当前节点的值,并且在这进行一个懒惰标记。不需要继续向下递归。如果下面的值查询需要用到的话,在递归的时候将懒惰标记向下传,并且值也可以进行更改。用到哪递归到哪。单点修改和区间修改一样,只是不需要懒惰标记,左区间等于右区间就行了。
在查询的时候,如果当前走到的区间完全被需要查找的区间包含的时候。直接返回这个节点的值。否则继续向下递归,注意区间的判断。递归完以后返回两次递归的返回值的和。这里面定义变量的时候需要注意初始化。
看代码: 注释打横线部分注意,容易错
#include<string.h>
#include<stdio.h>
long long sum[500010], lazy[500010];
void build(int l,int r,int o)
{
if(l==r)
{
scanf("%lld",&sum[o]);
return ;
}
int mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
sum[o]=sum[o<<1]+sum[o<<1|1];//------------
}
void pushdown(int l,int r,int o)
{
if(lazy[o])
{
lazy[o<<1]+=lazy[o];
lazy[o<<1|1]+=lazy[o];
sum[o<<1]+=lazy[o]*((r-l+1)-((r-l+1)>>1));
sum[o<<1|1]+=lazy[o]*((r-l+1)>>1);
lazy[o]=0;
}
}
long long query(int x,int y,int l,int r,int o)
{
if(x<=l&&y>=r)
return sum[o];
pushdown(l,r,o);
long long sum1=0;
int mid=(l+r)>>1;
if(x<=mid) sum1+=query(x,y,l,mid,o<<1);
if(y>mid) sum1+=query(x,y,mid+1,r,o<<1|1);
return sum1;//----------
}
void add(int x,int y,int s,int l,int r,int o)
{
if(x<=l&&y>=r)
{
lazy[o]+=s;
sum[o]+=(r-l+1)*s;
return ;
}
pushdown(l,r,o);
int mid=(l+r)>>1;
if(x<=mid) add(x,y,s,l,mid,o<<1);
if(y>mid) add(x,y,s,mid+1,r,o<<1|1);
sum[o]=sum[o<<1]+sum[o<<1|1];//注意-----
}
int main()
{
int n,m,t1,t2,t3;
while(~scanf("%d%d",&n,&m))
{
memset(lazy,0,sizeof(lazy));
memset(sum,0,sizeof(sum));
char c[10];
build(1,n,1);
for(int i=0;i<m;i++)
{
scanf("%s",c);
if(c[0]=='Q')
{
scanf("%d%d",&t1,&t2);
printf("%lld\n",query(t1,t2,1,n,1));
}
else
{
scanf("%d%d%d",&t1,&t2,&t3);
add(t1,t2,t3,1,n,1);
}
}
}
return 0;
}
POJ - 3468 线段树单点查询,单点修改区间查询,区间修改模板(求和)的更多相关文章
- 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新
目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...
- POJ 3468 线段树区间修改查询(Java,c++实现)
POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...
- C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...
- poj 3468 线段树区间更新/查询
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- poj 3468(线段树)
http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...
- hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- POJ 3468 (线段树 区间增减) A Simple Problem with Integers
这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...
- poj 3468 线段树 成段增减 区间求和
题意:Q是询问区间和,C是在区间内每个节点加上一个值 Sample Input 10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4Sample O ...
随机推荐
- Grafana使用总结
最近工作需求学习了下grafana,根据创建的几个dashboard简要记录下创建过程. 本次使用了grafana做可视化展示,data source使用的rds是postgresql和时序数据库in ...
- beego的安装以及bee的安装和使用
beego的安装以及bee的安装和使用 一.beego的安装 1.beego是什么 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用, ...
- JavaWeb中登录验证码生成
1.页面代码 <html> <head> <title>Title</title> <script type="text/javascr ...
- 简单谈谈HashMap
概述 面试Java基础,HashMap可以说是一个绕不过去的基础容器,哪怕其他容器都不问,HashMap也是不能不问的. 除了HashMap,还有HashTable跟ConcurrentHashMap ...
- 盘点Linux运维常用工具(二)-web篇之nginx
1.nginx的概述 .nginx是一个开源的.支持高性能.高并发的WWW服务和代理服务软件 .是由俄罗斯人Igor Sysoev开发的,具有高并发.占用系统资源少等特性 .官网:http://ngi ...
- 在Deepin系统上装Python 3.8遇到的那些坑
- 作为一天时间在Deepin上都没装好Python的代表,我感觉有必要记录一下我自己的解决方法 坑1-- SSL/TLS 字样错误 "pip is configured wih locat ...
- Java自学路线图之Java基础自学
自学Java要从Java基础语法开始自学,自学Java的过程中打好基础是很重要的!首先自学:面向对象基础,API基础,集合基础.这些对Java小白的数学和英语能力的要求门槛不高,在学习的过程中积累相应 ...
- vquery 一些应用
// JavaScript Document function myAddEvent(obj,sEv,fn){ if(obj.attachEvent){ obj.attachEvent('on'+sE ...
- spring Boot登录验证之验证码 邮箱
一 验证码 登录login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java&qu ...
- 数据库事务ACID详解(转载)
转载自:http://blog.csdn.net/shuaihj/article/details/14163713 谈谈数据库的ACID 一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行 ...