博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树链剖分基本步骤
阅读量:6621 次
发布时间:2019-06-25

本文共 1025 字,大约阅读时间需要 3 分钟。

总体步骤:init();          dfs1(1);          dfs2(1,1);          build(1,1,n);          cl();dfs1 处理出size[sj](子节点数),son[sj](重儿子),dep[sj](深度),vi[sj](点权,把边权放在子节点上)。dfs2 处理出top[sj](所在链的链首,轻儿子从子节点重新开始,重儿子从父节点继承),id[sj](点出现的位置,用cnt标记),pos[sj](cnt位置的边连着哪一个点)。      id[x]=++cnt;      pos[cnt]=x;      if(son[x])  dfs2(son[x],y);      for(int i=h[x];i!=-1;i=b[i].ne)        if(b[i].v!=fa[x]&&b[i].v!=son[x])  dfs2(b[i].v,b[i].v);build if(z==y) mx[x]=vi[pos[y]];      这个位置链的最大值等于这个位置的链所连点的权值。一般线段树方法建树。和线段树有关的数组要开四倍四倍四倍。。。cl 分change和query   Change 改变的边编号要按输入数据检索,从线段树上找到这条边上作为子节点的点改变它的点权。            int now=(b1<<1)-1;            int fr=b[now].u,to=b[now].v;            if(fa[fr]==to)   change(id[fr],b2,1,1,n);            else change(id[to],b2,1,1,n);   Query  query函数即为一般的线段树查询,把不在一条链上的两个点向一条链上靠拢,时刻注意要求哪点在下层。如果本来就是点权,则id[x]不应该+1且id[x]==id[y]的情况是可行的。       int fx=top[x],fy=top[y],res=1<<31;       while(fx^fy)       {            if(dep[fx]
dep[y]) jh(x,y); if(id[x]

转载于:https://www.cnblogs.com/moyiii-/p/7182863.html

你可能感兴趣的文章
BeetlSQL 2.11.0 发布,Java Dao 工具
查看>>
扫地机器人开年之战:新品初现,战局微调
查看>>
酒水品牌“谷小酒”获6300万元Pre-A轮融资,博将资本领投 ...
查看>>
揭秘 DockerCon 重量级演讲嘉宾(三)
查看>>
SpringBoot-Security-用户权限分配-项目搭建
查看>>
基于WebGL(ThingJS)的社区水电燃气管线3D可视化管理演示【三维管线,3D管线,水管可视化】 ...
查看>>
阿里云文件存储NAS简介及应用场景
查看>>
“数据结构+算法”视角的Asprova
查看>>
最严新规发布 网络短视频平台该如何降低违规风险? ...
查看>>
好程序员分享javascript中数组化的一般见解
查看>>
云服务器ECS出现速度变慢 以及突然断开怎么办?
查看>>
208亿背后的“秘密”
查看>>
美国自动驾驶法案今年通过无望,美议员发誓称明年继续
查看>>
Android系统自带样式(android:theme)解析
查看>>
全志A33开发板Linux内核定时器编程
查看>>
全栈必备 敏捷估点
查看>>
一个爬虫小技巧
查看>>
作为一名合格的JAVA架构师需要点亮哪些技能树?
查看>>
为什么短视频会让人刷不停?背后也许用了这套技术
查看>>
Kubernetes 在知乎上的应用
查看>>