线段树专题

顾琪坤

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. DP:Multiplication Puzzle(POJ 1651)

    卡片游戏 题目大意:给你一排卡片,你可以从从中抽一些卡片(但是不能抽最左和最右的卡片),每张卡片上有一个数字,当你从中抽出一张卡片后,你将得卡片的数字和卡片左右两张卡片的数字的乘积的分数,问当剩下最左 ...

  2. codeforces C. Vasily the Bear and Sequence 解题报告

    题目链接:http://codeforces.com/problemset/problem/336/C 题目意思:给出一个递增的正整数序列 a1, a2, ..., an,要求从中选出一堆数b1, b ...

  3. 【mysql】执行mysql脚本

    来源:http://zhidao.baidu.com/link?url=p78PlTJZlheB4uSKCkmZApg-3qrTIBCS3yI5LbGJLEAnUuO3-4GE6dLqq1LWC_kn ...

  4. [MAC] Mac OS X下快速复制文件路径的方法

    在windows上复制当前目录的路径有一个特别方便的方式,只需要用鼠标点击路径栏,它就会自动变成像”D:\Downloads\tmp”这样的路径,如果要复制文件路径,只需要将目录路径和文件名拼接起来即 ...

  5. svn插件subclipse使用http代理同步svn时出现异常(解决)

    现象描述: 对项目进行“与资源库进行同步”时弹出对话框显示以下错误信息: 同步 SVNStatusSubscriber 时报告了错误.1 中的 0 个资源已经同步. 同步 /MMonitorLogis ...

  6. Linux 中文乱码问题

    弄了好久还是乱码 最终方法:进入 vim /etc/vimrc中 原先只有一个 set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936改成: let ...

  7. C/C++函数参数读取顺序2

    #include <stdio.h>int main(){ int a=1,b=3,c=3; printf("%d, %d, %d",(a++,b++,c++),b,c ...

  8. Perl中的正则表达式

    转自:http://c20031776.blog.163.com/blog/static/684716252013624383887/ Perl 程序中,正则表达式有三种存在形式 分别是 (1 模式匹 ...

  9. Struts2 Convention插件的使用

    转自:http://chenjumin.iteye.com/blog/668389 1.常量说明 struts.convention.result.path="/WEB-INF/conten ...

  10. poj 2378(树形dp)

    题目链接:http://poj.org/problem?id=2378 思路:num[u]表示以u为根的子树的顶点个数(包括),如果去掉u之后u的每棵子树都小于等于n/2,则选择u. #include ...