转载请注明出处:http://www.cnblogs.com/StartoverX/p/4617963.html

  线段树是一颗二叉搜索树,线段树将一个区间划分成一些单元区间,每一个区间对应线段树的一个叶节点。对于线段树的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。

线段树的特征:

  1.线段树的长度不超过logL(L是最长区间的长度)。

  2.线段树把区间上的任意一条线段都分成不超过2logL条线段。

  这些结论为线段树能够在O(logL)时间内完成一条线段的插入,删除,查找等工作,提供了理论依据。

线段树的用途:

  线段树适用于和区间统计有关的问题。比如某些数据可以按区间进行划分,按区间动态进行修改,而且还需要按区间多次进行查询,那么使用线段树可以达到较快查询速度。

 数据结构:  

  1. typedef struct IntervalTree
  2. {
  3. int right;
  4. int left;
  5. IntervalTree* right_child;
  6. IntervalTree* left_child;
  7. /*other information*/
    //通常为了解题需要记录其他的信息。
  8. }IntervalTree;

在线段上建树:

  1. IntervalTree* buildTree(int a,int b)
  2. {
  3. IntervalTree* tree = new IntervalTree;
  4. tree->right = b;
  5. tree->left = a;
  6. tree->right_child = NULL;
  7. tree->left_child = NULL;
  8. if(b > a)
  9. {
  10.   int mid = (a + b)/;
  11.   tree->right_child = buildTree(mid+,b);
  12.   tree->left_child = buildTree(a,mid);
  13. }
  14. return tree;
  15. }
  16. //通常线段上会记录其他的信息,需要在建树时同时记录到树的每一个node。

线段树通常引入为了解决关于区间的问题,在树中插入线段,删除线段,查询线段的方法都和具体问题有关,我们以下面的问题为例: 

  1. 已知范围A1....An,在该范围内不断进行插入新线段(Ai...Aj,<=i<=j<=n),删除线段(Ai...Aj,<=i<=j<=n)的操作,最后求某个线段被覆盖的次数?

为了解决这个问题,我们在线段A1...An上建树,并且在线段树中保存被覆盖的次数cover。

数据结构:  

  1. typedef struct IntervalTree
  2. {
  3. int right;
  4. int left;
  5. int cover;//保存被覆盖的次数。
  6. IntervalTree* right_child;
  7. IntervalTree* left_child;
  8. }IntervalTree;

建树:

  1. IntervalTree* buildTree(int a,int b)
  2. {
  3. IntervalTree* tree = new IntervalTree;
  4. tree->right = b;
  5. tree->left = a;
  6. tree->cover = ;//初始时cover为0
  7. tree->right_child = NULL;
  8. tree->left_child = NULL;
  9. if(b > a)
  10. {
  11.   int mid = (a + b)/;
  12.   tree->right_child = buildTree(mid+,b);
  13.   tree->left_child = buildTree(a,mid);
  14. }
  15. return tree;
  16. }

插入新线段:

  1. void insert(int a,int b,IntervalTree* tree)
  2. {
  3. if(tree->right == b && tree->left == a)
  4. {
  5. tree->cover++;
  6. return;
  7. }
  8. int mid = (tree->left + tree->right)/;
  9. if(a > mid)
  10. {
  11. insert(a,b,tree->right_child);
  12. }
  13. else if(b <= mid)
  14. {
  15. insert(a,b,tree->left_child);
  16. }
  17. else
  18. {
  19. insert(a,mid,tree->left_child);
  20. insert(mid+,b,tree->right_child);
  21. }
  22. }

删除线段:

  1. void delete_interval(int a,int b,IntervalTree* tree)
  2. {
  3. if(tree->right == b && tree->left == a)
  4. {
  5. tree->cover--;
  6. return;
  7. }
  8. int mid = (tree->left + tree->right)/;
  9. if(a > mid)
  10. {
  11. delete_interval(a,b,tree->right_child);
  12. }
  13. else if(b <= mid)
  14. {
  15. delete_interval(a,b,tree->left_child);
  16. }
  17. else
  18. {
  19. delete_interval(a,mid,tree->left_child);
  20. delete_interval(mid+,b,tree->right_child);
  21. }
  22. }

查询线段覆盖次数:

  1. int query(int a,int b,IntervalTree* tree)
  2. {
  3. if(tree->right == b && tree->left == a)
  4. {
  5. return tree->cover;
  6. }
  7. int mid = (tree->right + tree->left)/;
  8. if(a > mid)
  9. {
  10. return tree->cover + query(a,b,tree->right_child);
  11. }
  12. else if(b <= mid)
  13. {
  14. return tree->cover + query(a,b,tree->left_child);
  15. }
  16. else
  17. {
  18. int cover_right = query(mid+,b,tree->right_child);
  19. int cover_left = query(a,mid,tree->left_child);
  20. return tree->cover + ((cover_right > cover_left) ? cover_right : cover_left);
  21. }
  22. }

线段树应用举例:POJ 3264:Balanced Lineup:http://www.cnblogs.com/StartoverX/p/4618041.html

[算法]线段树(IntervalTree)的更多相关文章

  1. [莫队算法 线段树 斐波那契 暴力] Codeforces 633H Fibonacci-ish II

    题目大意:给出一个长度为n的数列a. 对于一个询问lj和rj.将a[lj]到a[rj]从小到大排序后并去重.设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk.当中 ...

  2. 浅谈算法——线段树之Lazy标记

    一.前言 前面我们已经知道线段树能够进行单点修改和区间查询操作(基本线段树).那么如果需要修改的是一个区间该怎么办呢?如果是暴力修改到叶子节点,复杂度即为\(O(nlog n)\),显然是十分不优秀的 ...

  3. C++算法 线段树

    线段树这个算法,看起来非常高端,而且很有用处,所以还是讲一下下吧. 温馨提示:写线段树前请做好写码5分钟,调试一辈子的准备^-^ 啊直接步入正题…… 首先我们考虑一个题目:有一个序列,要做到单点修改单 ...

  4. POJ 3368 Frequent values RMQ ST算法/线段树

                                                         Frequent values Time Limit: 2000MS   Memory Lim ...

  5. [bzoj4372] 烁烁的游戏 [动态点分治+线段树+容斥原理]

    题面 传送门 思路 观察一下题目,要求的是修改"距离点$u$的距离一定的点权值",那这个就不能用传统的dfs序类算法+线段树维护,因为涉及到向父亲回溯的问题 看到和树上距离相关的东 ...

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

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

  7. RMQ问题(线段树+ST算法)

    转载自:http://kmplayer.iteye.com/blog/575725 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ ...

  8. nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)

    题目119 题目信息 执行结果 本题排行 讨论区 士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描写叙述 南将军统率着N个士兵,士兵分别编号为1~N,南将军常 ...

  9. 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)

    An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

随机推荐

  1. centos7安装VLC播放器

    centos7安装VLC播放器 1.安装eple 下载地址:https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noar ...

  2. POJ1260 Pearls(dp,矩阵链乘法)

    题目链接. 题目大意: 给定一个n,和两个序列a[i], p[i]. a[i] 表示需要购买 i品质 的数量,p[i] i 等级的价格. 1.每个品质都会有不同的价格,价格依据品质上升而上升 2.买一 ...

  3. 王学长的LCT标程

    善良的王学长竟然亲自打了一遍QAQ好感动QAQ #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  4. HDU 1254 推箱子 BFS

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...

  5. 【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错

    原文网址:http://blog.csdn.net/xiaanming/article/details/14450809 转载请注明出处:http://blog.csdn.net/xiaanming/ ...

  6. oracle number 和sqlserver numeric的区别

    number如果不指定范围默认是可以输入所有位数的小数,numeric如果不指定小数默认是不允许输入小数

  7. Linux下的memset函数

    函数原型 void *memset(void *s, int c, size_t n); 函数功能 将以s为首的存储空间前n字节空间全部替换为参数c指定的数据. 返回值 更新后的首地址s. 头文件 # ...

  8. puppet常用调试命令

    yum快速部署puppet测试环境(C/S端) rpm -ivh  http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm yum r ...

  9. 基于wax的lua IOS插件开发

    作者:朱克锋 邮箱:zhukefeng@iboxpay.com 转载请注明出处:http://blog.csdn.net/linux_zkf Objective-C的运行时支持新增类型和方法,但是由于 ...

  10. 微软下一代云环境Web开发框架ASP.NET vNext预览

    微软在2014年5月12日的TechEd大会上宣布将会公布下一代ASP.NET框架ASP.NET vNext的预览.此次公布的ASP.NET框架与曾经相比发生了根本性的变化,凸显了微软"云优 ...