补坑咯~

今天围绕的是一个神奇的数据结构:线段树。(感觉叫做区间树也挺科学的。)

线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素。

那么这个线段树有什么优势呢?

比如我们要多次查询1-n中的最大值,那么我们如果使用暴力来查找,那么我们每次查找的复杂度就是O(n)

但是如果我们把一个个区间变成树上的一个个点,并且我们严格保证树的深度,那么我们每次查找的复杂度就是O(logn)

这样就能让查询变得更快。

我们先简单讲一下线段树的存储(图中的标号就是线段树数组标号)

这就是线段树的存储方式。

然后我们来学习一下线段树的几个基本操作。

1:单点修改:

我们只要从1号节点往下查,如果在左边就把区间的右端点缩小,否则就把左端点增大,这个操作较为简单,不讲。

2、区间查询:

首先我们先把要查询的区间分为几段,分别刚好对应线段树上的端点,比如说2-5,我们会找到线段树中的9,5,12号节点。

然后我们在回溯的过程中合并答案就好了。

3、区间修改:

这是我们这节课的终点,但其实原理是一样的。

不过判断和区间查询略有区别。

因为区间查询的区间必须和线段树中的节点一一对应,而如果当前的区间在修改区间之内就可以进行修改。

那么区间修改有什么优化的技巧呢?

就是这个——延迟标记!

因为我们知道线段树不一定每次都查询到最底层,所以有时候如果我们把区间修改到树底,那么显然我们的时间复杂度会很高。

但是如果我们存一个延迟标记,在有需要的时候再进行传递,那么就能大大优化复杂度。

下面请看具体代码实现

  1. void pushdown(int k,int l,int r){
  2. mark[ls]+=mark[k];mark[rs]+=mark[k];
  3. int qaq=r-l+;
  4. sum[ls]+=(qaq-(qaq>>))*mark[k];sum[rs]+=(qaq>>)*mark[k];mark[k]=;
  5. }
  6. void update(int l,int r,int a,int b,int k,int add){
  7. if(a<=l&&r<=b){
  8. mark[k]+=add;
  9. sum[k]+=1ll*(r-l+)*add;
  10. return;
  11. }if(mark[k]&&l!=r)pushdown(k,l,r);
  12. if(a<=mid)update(l,mid,a,b,ls,add);
  13. if(b>mid)update(mid+,r,a,b,rs,add);
  14. sum[k]=sum[ls]+sum[rs];
  15. }
  16. long long query(int l,int r,int a,int b,int k){
  17. if(l==a&&r==b)return sum[k];pushdown(k,l,r);
  18. if(b<=mid)return query(l,mid,a,b,ls);
  19. if(a>mid)return query(mid+,r,a,b,rs);
  20. return query(l,mid,a,mid,ls)+query(mid+,r,mid+,b,rs);
  21. }

注:本模板求的是区间和。

培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)的更多相关文章

  1. hiho一下20周 线段树的区间修改

    线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...

  2. poj 3468:A Simple Problem with Integers(线段树,区间修改求和)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 58269   ...

  3. hihoCode 1078 : 线段树的区间修改

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  4. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  5. UVa 11992 Fast Matrix Operations (线段树,区间修改)

    题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...

  6. hiho一下21周 线段树的区间修改 离散化

    离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...

  7. HDU 1698 【线段树,区间修改 + 维护区间和】

    题目链接 HDU 1698 Problem Description: In the game of DotA, Pudge’s meat hook is actually the most horri ...

  8. HZAU 1207 Candies(线段树区间查询 区间修改)

    [题目链接]http://acm.hzau.edu.cn/problem.php?id=1207 [题意]给你一个字符串,然后两种操作:1,将区间L,R更新为A或者B,2,询问区间L,R最长的连续的B ...

  9. hihocoder1078 线段树的区间修改

    思路: 线段树区间更新.注意这里是把一个区间的所有数全部赋值为一个新的值. 实现: #include <bits/stdc++.h> using namespace std; ; ], l ...

随机推荐

  1. OpenCV入门:(六:基础画图函数)

    有时程序中需要画一些基础的图形,例如直线,矩形,椭圆以及多边形.OpenCV中当然有此类函数. 1.函数介绍 直线line: , , ) img – 图像 pt1 – 直线起点 pt2 – 直线终点 ...

  2. Chromium之文件类型

    .grp: Generate your project. 是由Json(JavaScript Object Notation)(or Python?)来解析,根据环境(OS,Compiler..)来生 ...

  3. HL7 2.6 解析(XML)

    用途:检验化验(LIS)实验室设备数据交换解析. using System; using System.Collections.Generic; using System.Text; using Sy ...

  4. [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)

    二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树BinarySort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)若它的左子树不为空,则左子树上所有结点 ...

  5. delphi数据库进行增加操作时,怎么判断插入的这个值是否已经存在?

    //增 procedure TForm1.btnAddClick(Sender: TObject); begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQu ...

  6. 条件查询Criteria

    public User getUserByNameCri(String name){ Session session = null; User user = null; try { session = ...

  7. 【bzoj4724】[POI2017]Podzielno 二分

    题目描述 B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零,不需要用完所有数字),使得X是B-1的倍数.q次询问,每次询问X在B进制 ...

  8. 安徽师大附中%你赛day2T3 巧克力 解题报告

    巧克力 题目描述 小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) .现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是 ...

  9. ext大法好啊

    http://www.cnblogs.com/keshuqi/p/6257895.html

  10. 打造适合日常使用的ubuntu,以ubuntu 16.04.1 LTS为例(不涉及版本)

    因为调试些程序需要用到ubuntu,又不喜欢虚拟机,因此装了双系统,在这过程中因为各种原因ubuntu来回安装过好多次,每次安装到用得爽都要捣鼓很久,也算稍微有点经验心得,将ubuntu调教的过程写在 ...