资源描述:
《线段树,总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划线段树,总结 [PKU2777]线段树(一){概述基本操作} { 以前写的线段树都是零碎 而且描述的也不清楚 最近打算整理一下 就从我的第一个线段树程序开始吧 } 线段树Segment_tree 网上有人把线段树翻译成Interval_Tree Interval_Tree是另外一种数据结构而且并非二叉树 这个是线段树的标准E文翻译 可以看wikipedia的原文http:///
2、wiki/Segment_tree 顾名思义线段树存储的是连续的线段而非离散的节点 先看一张经典的线段树图解 这个就是标准的线段树 既然是树形结构我们就得先考虑怎么存储这棵树 分析线段树的定义 *线段树是一棵二叉树记为T(a,b) *参数a,b表示区间[a,b]其中b-a称为区间的长度记为L目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的
3、业务技能及个人素质的培训计划 *线段树T(a,b)也可递归定义为 -若L>1[a,(a+b)div2]为T的左儿子 [(a+b)div2,b]为T的右儿子 -若L=1T为叶子节点 可以得到一些基本性质 *线段树除最后一层外是满二叉树 *线段树是平衡的高度是Log2L左右 如此我们有2种存储方法 *直接用指针 定义节点 typenode=record ls,rs:^node; l,r:longint; end; 其中lsrs分别为左右儿子l,r是区间的范围 真正实现时一般用数组模拟
4、指针 我们只需定义longint数组ls[]rs[]l[]r[] *用*2和*2+1代替左右儿子指针 由于是除最后一层外是满二叉树 我们可以向存储堆一样存储线段树 用l[]r[]来存储节点区间范围 x的左右儿子分别就是x*2和x*2+1目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 具体实现用位移代替乘2
5、这样乘法指针运算和上述数组调用一样几乎不需要时间 具体用哪种纯粹是个人喜好没什么区别 (下文中我的程序都是用的数组模拟直接存储儿子指针) 接下来讨论线段树的具体操作 也就是维护这种数据结构的算法(srO数据结构+算法=程序Orz) 总结起来就两个词递归&分治 结合一个具体问题吧PKU2777 【问题描述】 一个有L个格子的染色板,每个格子编号为1,2,3……L,每个格子初始都染成了1号色。一共有T种不同的颜色,编号分别为1,2,3……T。可进行O次操作。对染色板的操作有2种。 C(a,b,c)
6、意思是将染色板中编号为a~b的所有格子染成c号色(1≤a≤b≤L,1≤c≤T) P(a,b)意思是查询染色板中编号为a~b的格子染成的颜色种数。(1≤a≤b≤L) 【输入】 第一行有三个正整数,分别为L,T,O。 接下来有O行,每行为Cabc或Pab。目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 【输出】 输
7、出有若干行,分别回答输入中每个查询的结果。 【样例输入】 645 C122 C233 P13 C364 P16 【样例输出】 2 3 【数据规模】 1≤L≤100,0001≤T≤301≤O≤100,000 这是线段树的入门题相当经典 要求程序实现一个涂色的程序 支持对区间[A,B]涂C的颜色和统计区间[A,B]的颜色种类 朴素的做法是用数组a[]存储下整个区间[0,] 然后循环涂色循环查询这样的复杂度是N*N大大地TLE 我们考虑用线段树处理这个区间问题 首先我们得建树目的
8、-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 先看程序 1procedurebuild(a,b:longint); 2varx,mid:longint; 3begin 4inc(tt);x