1.维护区间最大最小值模板(以维护最小值为例)

  1. #include<iostream>
  2. #include<stdio.h>
  3.  
  4. #define LEN 11
  5. #define MAX 1<<30
  6.  
  7. using namespace std;
  8.  
  9. int arr[LEN]={,,,,,,,,,,};
  10. int st[LEN*]; //segment tree
  11. int n;
  12.  
  13. void init(int len){
  14. n=;
  15. while(n<len) n*=; //不断乘以2,知道>=len
  16. for(int i=;i<n;i++) st[i]=MAX;
  17. }
  18.  
  19. void update(int p,int v){ //我们有n(len的二次幂扩增)个叶子作为线段元素
  20. p+=n-; //地址重定向,变为叶子节点所在地址
  21. st[p]=v;
  22. while(p>){
  23. p=(p-)/; //向上跳转到父节点
  24. st[p]=min(st[p*+],st[p*+]); //更新父节点
  25. }
  26. }
  27.  
  28. // 查询[a,b)的最小值,当前函数的查询是[l,r) 。当前根节点为p
  29. int query(int a,int b,int p,int l,int r){//外部调用: query(a,b,0,0,n)
  30. //如果[a,b)与[l,r)不相交
  31. if(a>=r || b<=l)
  32. return MAX;
  33. //如果[a,b)包裹住了[l,r)
  34. if(a<=l && b>=r)
  35. return st[p];
  36. //其他情况,二分进行查询
  37. int v1=query(a,b,p*+,l,(l+r)/);
  38. int v2=query(a,b,p*+,(l+r)/,r);
  39. return min(v1,v2);
  40. }
  41.  
  42. int main(){
  43. init(LEN);
  44. int i,a,b;
  45. for(i=;i<LEN;i++)
  46. update(i,arr[i]);
  47. while(){
  48. scanf("%d%d",&a,&b);
  49. printf("%d\n",query(a,b,,,n));
  50. }
  51. return ;
  52. }

2.维护区间和的模板

数据结构:

  1. struct node
  2. {
  3. int left,right;
  4. int num;
  5. }tree[];

建树:

  1. void build(int left,int right,int index) //build(1,n,1);
  2. {
  3. he++;
  4. tree[index].left=left;
  5. tree[index].right=right;
  6. if(left==right)
  7. return ;
  8. int mid=(right+left)/;
  9. build(left,mid,index*);
  10. build(mid+,right,index*+);
  11. }

单点修改:

  1. void my_plus(int index,int dis,int k) //将索引为p的元素增加k
  2. { // my_plus(1,p,k)
  3. tree[index].num+=k;
  4. if(tree[index].left==tree[index].right) //没有叶子节点
  5. return ;
  6. if(dis<=tree[index*].right)
  7. my_plus(index*,dis,k);
  8. if(dis>=tree[index*+].left)
  9. my_plus(index*+,dis,k);
  10. }

单点查询:

  1. int search(int index,int dis) //调用方法:查找索引为p的元素:search(1,p)
  2. {
  3. if(tree[index].left==tree[index].right && tree[index].left==dis)
  4. return tree[index].num;
  5. if(dis<=tree[index*].right)
  6. search(index*,dis);
  7. if(dis>=tree[index*+].left)
  8. search(index*+,dis);
  9. }

区间修改:

  1. void pls(int index,int l,int r,int k)
  2. {
  3. if(tree[index].left>=l && tree[index].right<=r)
  4. {
  5. tree[index].num+=k;
  6. return ;
  7. }
  8. if(tree[index*].right>=l)
  9. pls(index*,l,r,k);
  10. if(tree[index*+].left<=r)
  11. pls(index*+,l,r,k);
  12. }

区间查询:

  1. void search(int index,int l,int r)
  2. {
  3. //cout<<index<<" ";
  4. if(tree[index].left>=l && tree[index].right<=r)
  5. {
  6. ans+=tree[index].num;
  7. return ;
  8. }
  9. if(tree[index*].right>=l)
  10. search(index*,l,r);
  11. if(tree[index*+].left<=r)
  12. search(index*+,l,r);
  13. }

3.模板编写练习:

ACM数据结构-线段树的更多相关文章

  1. ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)

    这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...

  2. ACM/ICPC 之 数据结构-线段树思想(POJ2182,含O(n^2)插入式解法)

    这道题在一定程度上体现了线段树的一种用法,解决的问题是:对于总计n个元素的第i个元素,已知其在[1,i]上部分序列的排名,求第i个元素在所有n个元素中的排名. 当然这道题数据比较水,所以用O(n^2) ...

  3. 算法手记 之 数据结构(线段树详解)(POJ 3468)

    依然延续第一篇读书笔记,这一篇是基于<ACM/ICPC 算法训练教程>上关于线段树的讲解的总结和修改(这本书在线段树这里Error非常多),但是总体来说这本书关于具体算法的讲解和案例都是不 ...

  4. 模板 - 数据结构 - 线段树/SegmentTree

    区间求加法和: 单点修改的,普通线段树. struct SegmentTree { #define ls (o<<1) #define rs (o<<1|1) static c ...

  5. 第二十九篇 玩转数据结构——线段树(Segment Tree)

          1.. 线段树引入 线段树也称为区间树 为什么要使用线段树:对于某些问题,我们只关心区间(线段) 经典的线段树问题:区间染色,有一面长度为n的墙,每次选择一段墙进行染色(染色允许覆盖),问 ...

  6. hiho1079 - 数据结构 线段树(入门题,离散化)

    题目链接 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去 ...

  7. 数据结构--线段树--lazy延迟操作

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

  8. 数据结构(线段树):BZOJ 3126: [Usaco2013 Open]Photo

    3126: [Usaco2013 Open]Photo Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 116 Descrip ...

  9. 数据结构(线段树):HDU 5649 DZY Loves Sorting

    DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Oth ...

随机推荐

  1. Channel延续篇

    上篇文章中介绍了NIO中的Channel,从Channel是什么.特性.分类几个方面做了下简单的介绍.但是后面Channel的分类,个人感觉不够全面,容易误导读者,特此以这篇文章加以补充. Chann ...

  2. java中Math类

    Math类 Math类是一个很有用的数学帮助类,使用也非常简单,这个类比较特殊,首先他和String类一样都是用final修饰,所以不能有子类,还有就是它的构造方法是私有的,也就是我们不能通过new的 ...

  3. javascript异步编程学习及实例

    所谓异步就是指给定了一串函数调用a,b,c,d,各个函数的执行完结返回过程并不顺序为a->b->c->d(这属于传统的同步编程模式),a,b,c,d调用返回的时机并不确定. 对于js ...

  4. div不换行的三种方法

    原文:https://www.cnblogs.com/zouwangblog/p/11149621.html float <div class="div1">123&l ...

  5. 第一阶段:Java基础 1.JAVA开发介绍---5. Java的注释,标识符、标识符的命名规范

    1.java注释 java中有三种注释方式,单行注释,多行注释,文档注释. (1).单行注释:快捷键Ctrl+/再次按撤销注释, (2).多行注释:Ctrl+shift+/ 撤销Ctrl+shift+ ...

  6. Java自学-操作符 算数操作符

    Java的算数操作符 算数操作符 基本的有: + - * / % 自增 自减 ++ -- 基本的加 减 乘 除: public class HelloWorld { public static voi ...

  7. Spring MVC Web.xml配置

    Web.xml spring&spring mvc 在web.xml中定义contextConfigLocation参数,Spring会使用这个参数去加载所有逗号分隔的xml文件,如果没有这个 ...

  8. 为元素添加 title 属性

    ---恢复内容开始--- 可以使用title属性(不要与title元素混淆)为网站上任何部分加上提示标签. ... <ul title="Table of Contents" ...

  9. ARM处理器基础知识

    1.ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 http://blog.chinaunix.net/uid-28458801-id-3494646.html 2.ARM的7种工作模式. ...

  10. go语言每个工程是不是都要单独设置GOPATH?

      go语言每个工程是不是都要单独设置GOPATH?比如我的go项目都统一管理在d:/workspace/go_work/目录下面,该目录下有3个项目project_01,project_02,pro ...