二分统计与线段树.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二分统计与线段树.ppt

简介 一定范围内计数问题特点: 1 描述简单 2 要求对数据动态维护,动态计算 解决手段:特殊的统计模式和结构 线段树 动态处理可以映射在一个坐标轴上的一些固定线段,例如求并区间的总长度,或者并区间的个数等等。 优点:随时插入一个区间或删除一个已有区间,并同时用低耗费维护需要的性质。 线段树-构造思想 下图显示了一个能够表示[1,10]的线段树: 线段树-动态数据结构 线段树-静态数据结构 用数组B[],E[],C[],LSON[],RSON[]。设一棵线段树的根为v。那么B[v],E[v]就是它所表示区间的界。C[v]用来作计数器。LSON[v],RSON[v]分别表示了它的左儿子和右儿子的根编号。 线段树-建树 从根对应的区间[a,b]出发,每次分成两个部分,分别建立对应的左右子树,直到面临一个初等区间[x,x+1]。 线段树-插入删除线段 将区间[c,d]插入线段树T(a,b),并设T(a,b)的根编号为v procedure INSERT(c,d;v) Begin mid=(B[v]+E[v]) div 2; if c≤B[v] and E[v]≤d then C[v] ← C[v]+1 else if c<mid then INSERT(c,d;LSON[v]); if d>mid then INSERT(c,d;RSON[v]); end 线段树-一个特殊性质举例 要得到线段树上线段并集的长度,增加一个数据域 M[v],讨论: C[v]>0,M[v] = E[v]-B[v]; C[v]=0 且v是叶子结点,M[v]=0; C[v]=0 且v是内部结点,M[v]=M[LSON[v]]+M[RSON[v]]; 线段树-变形,对点统计 [例一] 一位顾客要进行n(1≤n≤5000)天的购物,每天他会有一些帐单。每天购物以后,他从以前的所有帐单中挑出两张帐单,分别是面额最大的和面额最小的一张,并把这两张帐单从记录中去掉。剩下的帐单留在以后继续统计。输入的数据保证,所有n天的帐单总数不超过1000000,并且每份帐单的面额值是1到1000000之间的整数。保证每天总可以找到两张帐单。 建立点线段树,范围是[1,1000000],即每种面额的帐单设为一个叶结点。 如果C[LSON[v]]>0,那么树v中的最小值一定在它的左子树上。 如果C[RSON[v]]>0,它的最大值在右子树上; 一种静态统计方法 [例二]IOI2001 MOBILES : 在一个N*N的方格中,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子矩阵(x1,y1)-(x2,y2)中所有元素的和;修改的规则是指定某一个格子(x,y),在(x,y)中的格子元素上加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N≤1024,提问和修改的总数可能达到60000条。 一维序列求和 设序列的元素存储在a[]中,a的下标是1..n的正整数,需要动态地更新某个a[x]的值,同时要求出a[x1]到a[y1]这一段所有元素的和。 对于序列a[1..n],我们设一个数组C[1..n],C[i]=a[i-2k+1]+…+a[i],其中k为i在二进制下末尾0的个数 1001010110010000 k =4 计算C[x]对应的2k LOWBIT(x) 2k =x and (x xor (x-1)) 修改一个a[x]的值 与哪些C相关? 例如x=76=(1001010)2,从形式上进行观察,可以得到: p1= 1001010 p2= 1001100 p3= 1010000 p4= 1100000 p5 修改C[p1],C[p2],… procedure UPDATA(x,A) begin p←x while (p<=n) do begin C[p]←C[p]+A p←p+LOWBIT(p) end end 维护的费用:logn 求a[1]-a[x]的和 function SUM(x) begin ans ← 0 p ← x while (p>0) do begin ans←ans+C[p] p←p-LOWBIT(p) end return ans end 推广为原来的二维问题,把C构造成 C[x,y],其每一维定义与原来相同。 推广后算法:两层嵌套,一次维护费用为O(log2n) 静态二叉排序树实现 集合{

文档评论(0)

000 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档