题意:

给定一个数字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. 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  2. POJ 3468 线段树区间修改查询(Java,c++实现)

    POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...

  3. C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)

    参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...

  4. poj 3468 线段树区间更新/查询

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  5. poj 3468(线段树)

    http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...

  6. hdu 1698+poj 3468 (线段树 区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...

  7. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  8. POJ 3468 (线段树 区间增减) A Simple Problem with Integers

    这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...

  9. 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 ...

随机推荐

  1. 初学Qt——程序打包(环境vs2012+qt5.1.0)

    说来可笑,网上那么多的教程,偏偏结尾的时候就没有一个能详细的讲下关于程序的发布.开发Qt是这样,刚开始做web也是这样,因为是自学的,所以都没人可以教下,结果到了项目完成的最后总是要花费成吨的时间去查 ...

  2. swoole(3)网络服务模型(单进程阻塞、预派生子进程、单进程阻塞复用模型)

    一:单进程阻塞 设计流程: 创建一个socket,绑定端口bind,监听端口listen 进入while循环,阻塞在accept操作上,等待客户端连接进入,进入睡眠状态,直到有新的客户发起connet ...

  3. Java和C++引用的区别

    Java的引用实际上是对指针的一个封装. C++的引用是变量的一个别名. Java的定义出来的变量(除了基本类型)其实就是一个引用,指向真正的对象. C++可以通过将引用传入函数,在函数内修改所引用的 ...

  4. SQL基本操作总结

    1.SQL简介 结构化查询语言 (层次模型,网状模型,关系模型) 关系模型是目前的主流 (Oralce,mysql mssql ) SQL标准:ANSI (1992 1997 2002 ISO) 方言 ...

  5. javascript中你可能遇到的隐式调用

    前言 不知道用隐式调用来形容是否确切,其行为总是隐藏在背后,时不时出来露脸一下,作用貌似不大,但是了解一下还是有用处的,保不准在你的使用下大有作为.所谓的隐式调用简单来说就是自动调用一些方法,而这些方 ...

  6. html5调用摄像头功能

    前言 前些天,线上笔试的时候,发现需要浏览器同意开启摄像头,感觉像是 js 调用的,由于当时笔试,也就没想到这么多

  7. Yuchuan_Linux_C 编程之三 静态库的制作和使用

    一.整体大纲 二.静态库的制作 1)命名规则        lib + 库的名字 + .a        例如:libyuchuan.a2)制作步骤:        1). 生成对应的.o文件 -- ...

  8. String字符串位置移动

    有规律的String字符串位置移动 1.自定义一个有规律的String字符串 String numstr = "1,2,3,x,y,4,5"; 2.按逗号拆分numstr字符串 S ...

  9. PTP从时钟授时模块应用及介绍

    PTP从时钟授时模块应用及介绍 随着网络技术的不断进步和发展,NTP网络时间协议已经满不了一些精密设备和仪器的精度要求,这时就需要精度更高的PTP协议,PTP协议是一种应用于分布式测量和控制系统中的精 ...

  10. 02 HDFS 分布式环境实战

    HDFS的主要设计理念 1.存储超大文件 这里的“超大文件”是指几百MB.GB甚至TB级别的文件. 2.最高效的访问模式是 一次写入.多次读取(流式数据访问)3.运行在普通廉价的服务器上 HDFS设计 ...