题意:

给定一个数字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. Spring MVC知识梳理

    同上一篇博客,复习梳理SpringMVC知识点,这次的梳理比较快,很多细节没有顾虑到,后期可能会回来补充 1. 整体架构 1.1 在学习了SSM框架后我们来理清三者的应用层面 浏览器发送请求,请求到达 ...

  2. Day 3 DP

    1. P1015 精卫填海 01背包 + 判断 #include <iostream> using namespace std; , MAXV = ; int v, n, m, f[MAX ...

  3. HTML img标签的width height ismap usemap title alt 属性

    前言 img 元素向网页中嵌入一幅图像 今天特地对 img 的几个属性做了一下测试,在这里做一个笔记. 1. img 元素的width属性和height属性. (1)不设置 width 和 和 hei ...

  4. JZOJ 3453.【NOIP2013中秋节模拟】连通块(connect)

    3453.[NOIP2013中秋节模拟]连通块(connect) Time Limits: 1000 ms Memory Limits: 262144 KB (File IO): input:conn ...

  5. 自己查与写的批量比较bash

    前言:互测的时候一个一个输入感觉太麻烦,于是尝试写自己的对拍,又想到os刚学了bash命令行处理,于是想把两者结合一下减轻自己的工作量 分两步: 将所有人的工程导出成jar文件 放到linux下用ba ...

  6. new Date在IE下面兼容问题

    昨天碰到一个bug,用art-template模板进行渲染时候,周视图任务展示失败,都是暂无任务,我以为是模板兼容问题,但最开始我用的时候记得就是IE8的兼容性问题,引入es5-shim.min.js ...

  7. seo搜索优化教程14-seo搜索优化实战

    为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉信息科技强势推出seo搜索优化教程.此为seo教程第14课 根据前面学习的seo搜索优化内容,星辉科技进行总结性的分析,形成一份标准的se ...

  8. [pdo_mysql.lo] Error 1 或者 [php_mysql.lo] Error 1

    make: *** [pdo_mysql.lo] Error 1 make: *** [php_mysql.lo] Error 1 这是因为这是因为在编译时需要 MySQL 的头的文件.而它按默认搜索 ...

  9. 基于osg的python三维程序开发(三)------几何形体及纹理

    def createScene(): geode = osg.Geode() pointsGeom = osg.Geometry() vertices = osg.Vec3Array() vertic ...

  10. 【Android】四大组件归纳总结

    随着学习持续更新 四大组件均可使用android:process="name"在Manifest中声明成独立进程 Activity 生命周期 4种启动模式 Android使用回退栈 ...