线段树专题

顾琪坤

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. 把.pvr.ccz文件转换成png

    我用的是一个万能转换法,原理是先用CCSprite加载.pvr.ccz,然后把它绘制到一个CCRenderTexture上,然后再保存到文件里.这方法其实不只.pvr.ccz文件,其他所有能被coco ...

  2. Cocos2d-JS的屏幕适配方案

    Cocos2d引擎为游戏开发者提供了屏幕适配策略(Resolution Policy)解决方案. 使用方式 1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolut ...

  3. VS2010设置C++包含目录和库目录

    视图-属性管理器-随便选择一个项目例如MyProject-Debug|Win32-Microsoft.Cpp.Win32.user-右键“属性”-VC++目录 Release同理

  4. OpenGL在 win8 64bits系统下的配置

    1 program files(x86)与program files 在64位系统下,为了更好的兼容32位程序,在安装一些32位程序(注意某些程序他就是32位的),会默认扔到program files ...

  5. ImageLoader实现图片异步加载

    ImageLoader是一个广泛使用的图片库,在向网络请求图片时,使用imageView和smartView常会产生outofmemory错误,这时ImageLoader可以起到很大的作用,主要有如下 ...

  6. hrbustoj 1179:下山(DFS+剪枝)

    下山Time Limit: 1000 MS Memory Limit: 65536 KTotal Submit: 271(111 users) Total Accepted: 129(101 user ...

  7. hdu 4022 STL

    题意:给你n个敌人的坐标,再给你m个炸弹和爆炸方向,每个炸弹可以炸横排或竖排的敌人,问你每个炸弹能炸死多少个人. /* HDU 4022 G++ 1296ms */ #include<stdio ...

  8. sql2005-数据库备份方案 (转载)

    sql2005数据库备份一般情况分为二种:一是手工备份.二是自动备份.以下是二种方法的步骤: 一.手工备份 打开数据库,选择要备份数据库,右键选择[任务]->[备份],打开备份数据库页面,在[源 ...

  9. IEEE754测试-软件

    为满足硬件开发的同事验证从传感器采集到的数据是否正确,也为了方便我自己, 随手做了这个小东西,主要涉及浮点数的存储问题!

  10. IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题

    程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...