倍增 LCA
文章平均质量分 56
ssllyr
锦瑟无端五十弦,一弦一柱思华年。
展开
-
【ybtoj 4.5 倍增问题课堂过关】【洛谷P2680】E.运输计划【树上差分】
题目链接:gmoj,洛谷 分析 最大值最小,可以二分。 二分答案,然后判断的时候把所有大于midmidmid值的路径记录下来,找出被所有这样路径覆盖的最长的道路。 如果没有这样的道路 false;如果这样的道路被减去之后依然大于mid false ,找出被所有路径覆盖的道路。 在树中将所有路径起、始权值+1,LCA权值-2,从所有叶节点往上累加,最终权值为路径数的点到其父亲的边为所求边 dis[i]dis[i]dis[i]表示i到根的距离;t[i]t[i]t[i]表示iii这个点通往父亲的边,目的是记录..原创 2021-08-14 11:41:46 · 83 阅读 · 0 评论 -
【ybtoj 4.5 倍增问题课堂过关】【洛谷P1967】D. 货车运输【LCA+最大生成树】
题目链接:洛谷、ybtoj 分析 当两个城市可以互相到达的时候,最优路线一定位于原图的最大生成森林上。 这题是LCA经典应用:静态树上链的权值查询问题。 dis[i,j]dis[i,j]dis[i,j]表示从iii出发向上走2j2^j2j步的所有点的边权最小值。转移:dis[i,j]=min(dis[i,j−1],dis[f[i,j−1],j−1])dis[i,j]=min(dis[i,j-1],dis[f[i,j-1],j-1])dis[i,j]=min(dis[i,j−1],dis[f[i,j−1],.原创 2021-08-13 10:51:14 · 66 阅读 · 0 评论 -
【ybtoj 4.4 倍增课堂过关】A.查找编号
题目链接:查找编号 分析 跟二分查找是一样的,倍增缩小答案区间。 上代码 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,m,a[2000010]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(in.原创 2021-08-13 08:32:08 · 94 阅读 · 0 评论 -
【ybtoj 4.5 倍增问题课堂过关】C.树上距离【LCA】
题目链接:树上距离 分析 倍增求LCA,预处理fafafa数组的时候顺便求根节点到所有点的距离dis。 然后ans=dis[x]+dis[y]−2∗dis[lca(x,y)]ans=dis[x]+dis[y]-2*dis[lca(x,y)]ans=dis[x]+dis[y]−2∗dis[lca(x,y)] (x到根的距离+y到根的距离-两倍LCA到根的距离) 上代码 #include<iostream> #include<cstdio> #include<algorithm&.原创 2021-08-13 10:36:06 · 64 阅读 · 0 评论