Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198179
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2011-02-27 20:33:15

线段树的介绍:http://fqq11679.blog.hexun.com/21722866_d.html#commentsList
C[i]表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的个数,即去掉二进制i末尾的零的数到i的这个区间的数之和,在更新时必须快捷的更新所有包含数i的区间,在线段树中体现为必须更新C[i]的父节点及其以上的结点,在求前缀和时必须快捷的找到左边紧邻C[i]区间的那个最大的区间。
2^k=i&(i^(i-1))=i&(-i),C[i]的区间长度为i-(i-2^k+1)+1=2^k,因而紧邻C[i]的那个最大的区间为C[i-2^k],而在求其父节点x时,由于C[x]和C[i]有相同的区间下届,即两者所拥有的区间的起点相同,且父节点的层数比子节点大1,因而有i-2^k+1=x-2^(k+1)+1,即父节点x=i+2^k。
阅读(1045) | 评论(0) | 转发(0) |
0

上一篇:pku2777 Count Color

下一篇:AC自动机

给主人留下些什么吧!~~