【理解】线段树中树链存储方式
2016-02-19 18:04
363 查看
线段树中树链存储方式
回想建树方式:(从dfs_2开始)
void dfs_2(int x,int tt)
{
top[x]=tt;
po[x]=++cnt;
id[po[x]]=x;
if(son[x]!=0)dfs_2(son[x],pre); //这一步使重链成为连续区间;
for(int i=fst[x];i;i=use[x].next)
if(use[x].to!=fa[x]&&use[x].to!=son[x])
dfs_2(use[x].to,use[x].to);
}
我们用po[MAXN]:节点i在线段树中编号;
id[MAXN]:线段树中标号为i的节点对应树链中节点编号;、
(PS:建完树后pre[ ]数组便完成了任务)
void build(int k,int l,int r)
{
a[k].l=l;a[k].r=r;
if (l==r) {a[k].sum=a[k].max=data[pre[l]];return;}
int mid=(l+r)>>1;
build(k<<1,l,mid);build((k<<1)+1,mid+1,r);
up(x,l,r);
}
从dfs_2可看出:重链的节点在线段树中是一段连续的区间的!
所以当点是重链上点时可以直接统计该点 x 到其 top[x] 间的数据;
若该点 x 为轻边中的点时,其 top[x] == x,只可以统计一个点;
并且这时只可以跳一下,用 fa[x] 跳到其父亲节点,继续判断;
相关文章推荐
- 关于使用 QEMU 对系统进行 profile
- java 面试题
- 制作framework库文件的详细步骤---iOS9,Xcode7.2
- shell脚本教程
- 每天学习一点儿 swift
- HDU 1054 Strategic Game(无向二分图的最大匹配)
- Iperf安装使用及测试专线带宽
- App集成ApplePay的一些资料整理
- 单项循环链表
- 左侧固定宽,右侧自适应屏幕宽,左右两列,等高布局
- JSON和JS对象之间的互转
- Visibility属性控制元素的显示和隐藏
- 以太网帧格式
- Database LeetCode Department Highest Salary
- iOS解析XML
- android:TableLayout表格布局详解
- magento优惠码提交不了
- sql 查出一张表中重复的所有记录数据
- android: android中dip、dp、px、sp和屏幕密度
- 无阻塞加载脚本的方案