LCA
解决树上问题的利器
为什么他们cf写的这么快
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #480 (Div. 2) E. The Number Games(倍增+贪心)
题目链接 题意:给定一棵树,要求你删除k个点,删除点后整个数的依然连通,同时剩下点的点权要最大。 思路:以n为根,贪心的选择尽量大的点,然后要判断这个点能不能选,能选的话,把它到根节点路径上的点也肯定要一起选,check函数就是用来判断i点能不能选(能不能选的关键是看,i到它的祖先节点中第一个没有被选的点的点数目是否小于等于k),LCA倍增加速。 #include<bits/stdc++...原创 2020-04-05 21:43:37 · 132 阅读 · 0 评论 -
Codeforces Round #629 (Div. 3) E. Tree Queries(LCA+思维)
题目链接 题意:给定n点,n-1条边的树,有m个询问,每次询问会给你一个数组,问你树中是否存在着一条从1到某个点的路径包含数组中的所有点,或者数组中的这些点距离这条路径的路径上的点的距离小于等于1. 思路:很明显如果存在这条路径的话,那么给定的这些数组的点和路径上的点要么重合,要么就是它的兄弟节点。比如第一个样例,我们选最深的点10,然后就选择树上1到10的这条路径,很显然8和9是兄弟节点所以...原创 2020-03-27 10:53:25 · 209 阅读 · 0 评论 -
Educational Codeforces Round 51 (Rated for Div. 2) F. The Shortest Statement(最短路+LCA+思维)
题目链接 思路:由于m-n小于20,两点之间的最短路只有两种情况。1、两点的最短路不经过非树边,那么最短路用lca求就行了,2、如果至少经过一条非树边呢?这题精华就在这儿,由于m-n小于20,最多只有40个点连这非树边,于是对这些点求spfa,最多执行40遍spfa,再进行比较就行了,这里说一下经过非树边的最短路是d【i】【x】+d【i】【y】,表示的是以i为顶点到x的最短距离+到y的最短距离...原创 2020-03-26 20:41:55 · 151 阅读 · 0 评论 -
Educational Codeforces Round 3 E. Minimum spanning tree for each edge(最小生成树+带权LCA+倍增)
题目链接 题意:给定n个点,m条边的图,要你输出对于一条边u->v来说,如果一定要让他加入生成树里,求有它的时候的生成树的最小值。 思路:我们先构造好初始的生成树,如果一条边u->v不在生成树里,那么那么我们要让新的生成树最小的话就得删去u->v的路径上的边权最大的边maxx就可以了,如果找u->v路径上的最大边呢?可以用树上带权倍增法。 #include<bits...原创 2020-03-12 20:29:11 · 155 阅读 · 0 评论 -
Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground(LCA)
题目链接 题意:给你一棵树, n个点,有q个询问, 每一次询问给出三个点a, b, c 问从其中两点到第三点的最长公共路径是多长。 思路:对于a,b,c求任意两点的相同路径这里有个公式:dis(a,b)+dis(c,b)-dic(a,c)/2(其中b是终点),我们只要找最大的就可以了。 对于三个点来说, LCA的一些性质: 三个点任意两点求出的三个lca 必定会有两个相同的点。那么第三个lca...原创 2020-03-02 22:09:05 · 127 阅读 · 0 评论 -
Codeforces Round #620 (Div. 2) E. 1-Trees and Queries(LCA+思维)
题目链接 思路:有个结论,如果要满足k条边的话,路径长度dis和k的奇偶性必须相同(这个结论不难证,最好自己去试试???),然后满足条件的路径有三条:1、a->b;2、a->x->y->b;3、a->y->x->b; 只要这三条路径有一条满足长度等于k或者与k的奇偶性相同答案就是YES,路径长度的话可以用lca求。 #include<bits/s...原创 2020-02-16 16:40:07 · 155 阅读 · 0 评论 -
Codeforces Round #617 (Div. 3) F. Berland Beauty(LCA+思维)
题意:给定一棵n个点的树以及n-1条边,现在给出m组ui,vi,wi,表示ui到vi这条最短路径上的最小边权是wi,要你构造出树的边权。 思路:树上两点的最小边权可以通过lca的方法来遍历求出,关键是怎么构造边权?其实可以把给出的m组条件按从大到小排序,只要保证i点和j点的路径上是权值最大的边先赋值就行。 #include<bits/stdc++.h> using namespac...原创 2020-02-05 19:50:32 · 187 阅读 · 0 评论