线段树专题

顾琪坤

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线段树的更多相关文章

  1. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  2. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  3. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  4. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  5. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  6. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  7. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  8. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  10. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

随机推荐

  1. annotation(@Retention@Target)详解

    一.注解:深入理解JAVA注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 1.元注解(meta-a ...

  2. Cannot change version of project facet Dynamic web module to 2.5

    在工程目录下有一个.settings文件夹,打开org.eclipse.wst.common.project.facet.core.xml做如下修改:<installed facet=" ...

  3. Python网络编程(4)——异步编程select & epoll

    在SocketServer模块的学习中,我们了解了多线程和多进程简单Server的实现,使用多线程.多进程技术的服务端为每一个新的client连接创建一个新的进/线程,当client数量较多时,这种技 ...

  4. wget 增加单个文件下载限制大小

    增加了参数 -M --limit-size 使用方法 -M 5m 或者 -M 500k 或者 --limit-size=5m 或者 --limit-size=500k 下载地址 http://pan. ...

  5. css3学习总结4--CSS3背景

    css3背景 1. background-size 2. background-origin 3. background-clip 示例: className { background:url(bg_ ...

  6. 编译qt

    进入开始菜单Microsoft Visual Studio 2010,Visual Studio Tools,Visual Studio Command Prompt (2010),需要注意的是,这里 ...

  7. MVC模式简介

    MVC模式是一种表现模式,它将web应用程序分成三个主要部分即:模型(Model)视图(View)控制器(Controller)M:Model主要是存储或者是处理数据的模型,包含了用户使用的数据,业务 ...

  8. 【转载】C++ 值传递、指针传递、引用传递详解

    原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...

  9. git linux

    第一节 GIT最初是由Linus Benedict Torvalds为了更有效地管理Linux内核开发而创立的分布式版本控制软件,与常用的版本控制工具如CVS.Subversion不同,它不必服务器端 ...

  10. 浅谈Java的输入输出流(转)

    Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象.在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输 ...