树结构在程序的设计中的运用.ppt

树结构在 程序设计中的运用;目录; 2003年竞赛的知识结构分布; 竞赛; 竞赛;试题特点;试题特点;启示;培养内省智力;充分利用网络上与信息学活动相关的信息资源;充分利用网络上与信息学活动相关的信息资源 ;以问题为出发点、以自主探究为途径、以构造网络式思维模式为基础、以创新为目的组织集训;建立知识信息网络 ;触类旁通、联想外推 ;近年来,由于各种竞赛纷纷采用free-pascal,因此对于算法来说,空间效率上的要求降低了,而对时间效率却提出了更高的要求。这使得选手不仅要娴熟地掌握常规算法,而且要大胆创新,构造更高效的算法来解决问题。 在以往的程序设计中,链式结构采用得较多。的确链式结构有编程复杂度低、简单易懂等优点,但有一个致命的弱点:相邻的两个元素间的联系并不明显。而树结构却能很好的做到这一点。 选手对树的先根遍历十分娴熟,但对后根遍历却不能像先根遍历那样应用自如。;树结构在程序设计中的运用;并查集;链结构的并查集;树结构的并查集;直接在树中查询;边查询边“路径压缩”;银河英雄传说 ;;;1、查找根节点并进行路径压缩 ;2、计算合并指令 ;3、计算询问指令 ;由此得出主程序:;线段树;线段树-构造思想;特点;线段树的存储结构 1、动态数据结构;2、静态数据结构;线段树的运算 1、建树;2、插入线段;3、删除线段 在线段树T(a,b)中删除区间[c,d],并设T(a,b)的根编号为v:; 线段树的动态维护 1、计算测度;连续线段数line[v]指的是区间中互不相交的线段条数。;↙Lbd=1;线段树的变形——对点统计;[例一]商品促销; 建立点线段树,范围是[1,1000000],即每种面额的帐单设为一个叶结点。 如果C[LSON[v]]0,那么树v中的最小值一定在它的左子树上。 如果C[RSON[v]]0,它的最大值在右子树上; 线段树的深度为log 1000000 =20;      ; 农夫Don要监察他的N米乘N米(2? N ? 500,000)的正方形田园的围栏。该围栏的一角在原点(0,0)上,另一对角則在坐标点(N,N)上, 围栏的边平行於X轴及Y轴。围栏上有些支柱, 這些支柱分別立在围栏的四個角上及围栏的每条边上每隔1米的地方, 因此整个围栏上就有4N根支柱。這些支柱是垂直的,而且可以认为其半径为0。农夫Don希望知道,当他站在田园中的某一点时他可以看到的支柱的数量。 农夫Don的田园內有R块巨石 (1 ? R ? 30,000) 阻碍他的视线。因為他不夠高,无法从巨石上面望过去,因此有些支柱看不到。巨石的底部是一个面积不为零的凸多边形, 而多边形的端点坐标均为整数。巨石垂直地立在地上。巨石之間不重叠,互相之間不接触, 巨石与农夫Don或围栏也不接触。农夫Don所站立的地方也不接触围栏,他也不会站在巨石內或巨石上。 给定农夫Don的围栏大小, 其內的巨石的位置及形状,以及农夫Don所站立的位置, 求出Don在该位置上可以看到的支柱数量。如果一根支柱在农夫Don的视线上刚好和巨石的边重叠,则农夫Don是看不到该支柱的。 ;将统计农夫位置“可视”的正方形四条边界上的整点总数问题,简化为计算农夫站立位置到正方形下边界线的可视点数的问题。 ;若第j个顶点位于农夫位置的下方(y[i]^[j]y[0]^[1]),则计算截点的x坐标(hv为截点存在标志) x0= x[0]^[1]+ *y[0]^[1]) lt= rt= ;构建区间表xx和tp;计算正方形下边界线上被挡住的整点数a1 ; sort(1,lg);{对区间表进行分治排序} s:=0; al:=0;{初始化点值和与测度} for i:=1 to lg do(从左到右扫描区间表的每一个元素) if tp[i]=1{一个新区间开始} then begin if s=0 then lt:=xx[i];{若点值和为0,则该截点作为连续区间的左端点} inc(s){ 点值和+1} end{then} else begin(若当前区间结束,统计测度) if s=1 then al:=al+trunc(xx[i])-trunc(lt-zero)+ord(lt1e-6); dec(s) { 点值和-1} end;{else} 显然,正方形下边界线上的可视点数为n-a1。

文档评论(0)

1亿VIP精品文档

相关文档