A线段树
线段树专题
顾琪坤
1、简介:
打acm的时候,经常会碰到一类问题,比方给你n个数的序列,然后动态的更改某些数的值,然后又动态地询问某个区间的值的和或者其它乱七八糟的东西,对于单个更改或者询问,也许很轻松的就能写出O(n)的算法,但可能n比较大,可能有10的5次方的数量级,并且更改和询问的操作总次数q很多,q可能也是10的5次方的数量级,那么简单的写来的话,整个程序的复杂度是O(n*q),也就是10的10次方的数量级,这个复杂度在acm题目中是不可承受的,因为对于1s时限的题目,只能承受10的7次方的左右的数量级。
对于这类问题,就需要利用线段树这种数据结构了,这种神奇的数据结构能把上面那些问题在O(q*log(n))的时间内解决。
适用:
不单单有专门为线段树出的题,很多时候,线段树作为一种辅助出现,用来优化整个程序的效率,经常和动态规划搞在一起,比方求最长上升子序列的时候,普通的动态规划需要O(n^2)的复杂度,利用线段树优化就能降到O(n*log(n))的复杂度。
我的看法:
线段树,非常简单,但又因为它非常灵活,搞得题目可难可易,经常会有非常恶心的线段树题,想掌握它需要挺长时间的。
个人认为,在acm中线段树是一种非常简单的数据结构,非常形象也很容易理解。所每个acmer都应该掌握线段树的基本应用,而一个队伍中至少有一个人非常精通它,队伍的其他两人都应该会用它以及大概知道怎样的题可以用线段树解决。

线段树的结构:
线段树是建立在线段(或者说区间)基础上的树,树的每个节点代表一条线段[a,b](先规定一下,这里的线段是离散的点构成的,比方对于一个序列A1,A2,A3,A4,A5,A6,A7,,区间[3,5]代表的是{A3,A4,A5}这个意思,当然线段树也能搞连续的线段,这个与离散的大体相同,就少许地方不同,可自己联想)。
如果在线段[a,b]中,a==b了,说明这个节点只代表一个点了,它就是一个叶子节点。
如果线段[a,b],a!=b,说明这个节点代表的不值一个点,那么它会有两个儿子,左儿子代表的区间是[a,(a+b)/2],右儿子代表的区间是[(a+b)/2+1,b]。
这样的一个结构,一个区间每次都被折一半往下分,所以最多被分log(n)次就分到最低层。那么想要查找一个点或者区间的时候,顺着节点往下找,最多也就log(n)次就能找到。
2、线段树题目:
http://www.notonlysuccess.com/index.php/segment-tree-complete/
这个博客讲的比较完美了,做完就比较厉害了。
另外还有一些二维线段树丫,线段树的恶心应用之类的,想精通线段树的童鞋可以去研究一下。
3、国家集训队2004论文集 林涛:《线段树的应用》
下载:
http://pan.baidu.com/share/link?shareid=815396465&uk=2788351563&fid=325647541&qq-pf-to=pcqq.c2c
Ppt:
http://wenku.baidu.com/link?url=R36BjToJkM8prhbQeeTsYkURG2SQ7rXrtdl-ELEn9PvO_xXTY1k8DzhiQj1JvUXt6lsLPrMRiHym1LwGBrDXNioZj3VeOTVfwj4TntF1Ngy
A线段树的更多相关文章
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【BZOJ-2653】middle 可持久化线段树 + 二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
随机推荐
- maven项目 Java compiler level does not match the version of the installed Java project facet
因工作的关系,Eclipse开发的Java项目拷来拷去,有时候会报一个很奇怪的错误.明明源码一模一样,为什么项目复制到另一台机器上,就会报“java compiler level does not m ...
- Cocos2d 中的Sprite大小调整问题
以前用UIImageView,比如 UIImageView *view = [[UIImageViewalloc] initWithImage:[UIImageimageNamed:@"b ...
- iOS 中添加lib型target库的依赖问题
今天在编码时遇到一个问题,总提示我找不到系统库文件. 我的项目结构类似下图 在TestLib中有引用CoreLocation库的类.但是CoreLocation库需要加在PhotoInfoDemo对象 ...
- angularjs 指令(directive)详解(2)
原文地址 上一篇我们说到了transclude,那么,我们现在继续讲解之后的内容. 9.scope 可选参数,默认值为false.取值: false - 在这个directive里不会创建新的scop ...
- [Android Pro] 超能RecyclerView组件使用
RecyclerView最强大的功能在于秒变功能,只需要改动很少的代码就可以实现ListView,GridView及水平ListViw的切换功能 public class MainActivity e ...
- ajax(ajax开发与入门)
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX是一种进行页面局部异步刷新的技术,局 ...
- ip数据结构
本文摘自 linux kernel ip.h,感谢开源的GNU struct ip { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4 ...
- editplus快捷键大全
Eclipse快捷键 10个最有用的快捷键 1. ctrl+shift+r:打开资源 ctrl+b编译 ctrl+d删除 2. ctrl+o:快速outline --->这个是查看一个类中的用 ...
- gitlab安装
[root@localhost ~]# wget https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rp ...
- 人人都可以开发高可用高伸缩应用——论Azure Service Fabric的意义
今天推荐的文章其实是微软的一篇官方公告,宣布其即将发布的一个支撑高可用高伸缩云服务的框架--Azure Service Fabric. 前两天,微软Azure平台的CTO Mark Russinovi ...