线段树及其应用.pptVIP

  • 6
  • 0
  • 约1.58万字
  • 约 59页
  • 2017-06-05 发布于湖北
  • 举报
线段树及其应用概要

线段树及其应用 江苏省华罗庚中学 杨志军 oldsheep@ 为什么要用线段树? 为什么要用线段树? 为什么要用线段树? 为什么要用线段树? 为什么要用线段树? 为什么要用线段树? 线段树的结构 线段树的结构 线段树的结构 线段树的性质 线段树的存储方式 线段树的基本操作及实现 线段树的基本操作及实现 线段树的维护方法 线段树的维护方法 (1)对元素进行修改 (2)对区间进行查询 (3)对区间修改(统一加上一个数) (4)对区间查询 (5)对区间修改(设置为同一个数) (6)对区间查询 线段树的维护方法 线段树的维护方法 为什么要用线段树? 应用举例 应用举例(线段覆盖) 应用举例(线段覆盖) 应用举例(线段覆盖) 应用举例 应用举例(售票系统) 应用举例(售票系统) 应用举例(售票系统) 应用举例(售票系统) 算法改进 应用举例 应用举例(采矿) 应用举例(采矿) 应用举例 应用举例(面积) 应用举例(面积) 应用举例(面积) 应用举例(面积) 应用举例 应用举例(蛇) 应用举例(蛇) 应用举例(蛇) 应用举例(蛇) 线段树与RMQ的比较 线段树与RMQ的比较 线段树与树状数组的比较 线段树与平衡树的比较 参考资料 晚间讨论 例3、售票系统 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,每一个售票申请包含三个参数,分别用O、D、N表示,O为起始站,D为目的地站,N为车票张数,售票系统对该售票申请作出受理或不受理的决定。只有在从O到D的区段内列车上都有N个或N个以上的空座位时该售票申请才被受理。1=C=60000,1=S=60000,1=R=60000,C为城市个数,S为列车上的座位数,R为所有售票申请总数。 输入: 4 6 4 1 4 2 1 3 2 2 4 3 1 2 3 输入: YES YES NO NO 可以把所有的车站顺次放在一个数轴上,在数轴上建立线段树,在线段树上维护区间的delta与max,每次判断一个售票申请是否可行就是查询区间上的最大值;每个插入一个售票请求,就是给一个区间上所有的元素加上购票数。 procedure build(cur:node;l,r:longint); begin cur^.left:=l; cur^.right:=r; if l=r then begin cur^.leftchild:=nil; cur^.rightchild:=nil; cur^.delta:=0; cur^.max:=0; end else begin new(cur^.leftchild); new(cur^.rightchild); build(cur^.leftchild,l,(l+r) div 2); build(cur^.rightchild,(l+r) div 2+1,r); end; end; procedure update(cur:node;l,r,delta:longint); var lc,rc:node; begin lc:=cur^.leftchild; rc:=cur^.rightchild; if (l=cur^.left) and (r=cur^.right) then begin cur^.delta:=cur^.delta+delta; cur^.max:=cur^.max+delta; end else begin if l=(cur^.left+cur^.right) div 2 then update(lc,l,r,delta); if r(cur^.left+cur^.right) div 2 then update(rc,l,r,delta); if lc^.maxrc^.max then cur^.max:=lc^.max+cur^.delta else cur^.max:=rc^.max+cur^.delta; end; end; function querymax(cur:node;l,r:longint):longint; var lc,rc:node; ret:long

文档评论(0)

1亿VIP精品文档

相关文档