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 ...
随机推荐
- C++走向远洋——34(友元函数,成员函数和一般函数的区别)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:youyuan.cpp * 作者:常轩 * 微信公众号:Worl ...
- alibaba开发手册
alibaba开发手册 11.19 强制: 方法参数在定义和传入时,多个参数逗号后边必须加空格. IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 ...
- PostgreSQL与MySQL对比
都属于开放源码的一员,性能和功能都在高速地提高和增强.MySQL AB的人们和PostgreSQL的开发者们都在尽可能地把各自的数据库改得越来越好,所以对于任何商业数据库使用其中的任何一个都不能算是错 ...
- 01 Taro_Mall 开源多端小程序框架设计
项目介绍 Taro_Mall是一款多端开源在线商城应用程序,后台是基于litemall基础上进行开发,前端采用Taro框架编写,现已全部完成小程序和h5移动端,后续会对APP,淘宝,头条,百度小程序进 ...
- Python中的BeautifulSoup库简要总结
一.基本元素 BeautifulSoup库是解析.遍历.维护“标签树”的功能库. 引用 from bs4 import BeautifulSoup import bs4 html文档-标签树-Beau ...
- 用canvas实现简单的下雪效果
首先新建一个html文件,将body的背景设置为天空的那种深蓝色,并创建一个canvas,canvas的操作逻辑都放在snow.js中: <!DOCTYPE html> <head& ...
- node中fs模块 - fs.open() fs.read() fs.write() fs.close()
var fs = require('fs') fs.open('./a.txt', 'a+', function(err, fd) { // 打开文件后 创建缓冲区放置数据 ), // 读取多少字节 ...
- npm install、npm install --save与npm install --save-dev、npm install -g区别
npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...
- Flink系列之状态及检查点
Flink不同于其他实时计算的框架之处是它可以提供针对不同的状态进行编程和计算.本篇文章的主要思路如下,大家可以选择性阅读. 1. Flink的状态分类及不同点. 2. Flink针对不同的状态进行编 ...
- RIP实验
实验要求 1. 理解 RIP 协议的工作原理2. 理解 RIPv1.RIPv2 的特性3. 掌握 RIP 协议的基本配置方法4. 掌握 RIP 自动汇总和手动汇总的方法5. 掌握 RIP 配 ...