LCA
小菜鸡加油
菜鸡
什么都能折磨
展开
-
B. Alyona and a tree(思维+倍增/二分+树上差分)
https://codeforces.com/problemset/problem/739/B思路:对于题目的条件,转化成对于某个点,其有多少点能控制它。朴素就是每个点网上跳对于每个点能更新的更新,不能更新意味着break。O(n^2)break意味着其条件满足单调性,于是可以树上二分能到的最远的祖先,当然了,倍增也是同样的道理,其二进制能表示出最远的祖先。然后对于起点到祖先的一段区间,我们可以直接+1,树上差分比较方便(当然你硬要写个树剖再多个log.....也无话说对于求带边权的两点原创 2021-04-11 14:57:43 · 194 阅读 · 0 评论 -
1328E - Tree Queries(思维+LCA)
https://codeforces.com/problemset/problem/1328/E给出一棵以点 1 为根节点的树,接下来有 m 次询问,每次询问给出 k 个点,题目问我们能否找到一个点 u ,使得从根节点到点 u 的简单路径,到 k 个点的每个点的距离都小于等于 1思路:开始想着k个点两两暴力匹配找lca..但是实际上找最深的一个来匹配就行了。然后看其他的点和他的lca是否距离>1#include<iostream>#include<vector&.原创 2021-04-01 00:31:53 · 222 阅读 · 0 评论 -
H. 3.小w的佛光(树上含公共点的两条路径的重合长度)
求重合长度的一个小trick:Len:A->B与Len:B->C的共同路径长为(Length(AB)+length(BC)-length(AC))/2对于求length(AB):即其1+|dep[lca(a,b)]-dep[a]|+|dep[lca(a,b)]-dep[b]|至于求lca,倍增树剖tarjan皆可因为是点权,所以最后要+1#include<iostream>#include<vector>#include<queue>..原创 2021-01-31 12:46:08 · 228 阅读 · 0 评论 -
C.Lorenzo Von Matterhorn(思维+朴素lca思想)
https://codeforces.com/group/qWc0vtZbjV/contest/697/problem/C思路:开始第一眼是树剖,看了一下发现1e18,就尝试了一下离散化。做了发现连边的对应关系不对了。然而如果是完全二叉树1e18也建立不下。因此不考虑建树。对着采用朴素lca的思想往上跳,每个点最多跳60次,然后跳的过程中更新该节点的权值。#include<iostream>#include<vector>#include<queue>原创 2021-01-27 14:29:24 · 373 阅读 · 1 评论 -
SPOJ-COT Count on a tree求树上的某条路径上第k小的点(LCA+主席树)
https://vjudge.net/problem/SPOJ-COT思路:以1为根,类似原来板子的按照线性序列去开新的主席树,这里按照图的先序遍历开新的主席树。一棵树表示该点到根节点的前缀关系。那么寻找路径上的第k点,利用和LCA的前缀关系。不过这里和之前https://blog.csdn.net/zstuyyyyccccbbbb/article/details/109882553这题有个共同的关于LCA点权的重复部分。在这里通过LL sum=tree[tree[pre].l].sum+t原创 2020-11-25 17:10:05 · 196 阅读 · 0 评论 -
树链剖分求LCA板子
#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#define debug(a) cout<<#a<<"="<&l...原创 2020-11-20 15:45:27 · 110 阅读 · 0 评论 -
ACM Contest and Blackout(非严格次小生成树板子+LCA)
https://vjudge.net/problem/UVA-10600/origin板子题。求非严格次小生成树树有大致有两种。一种是暴力,枚举不在最小生成树的边,然后跑n-1次最小生成树。(O(n^2logn)大致)或者dfs找最小生成树环上的最长边替换掉。借xayata_大佬的图。优化的办法就是在最小生成树中,看成一颗树,然后化成有根树,用倍增的思路融合ST的思路,维护u,v的lca(u,v)的最长边。一个倍增数组记录父亲,一个倍增数组记录(u,lca(u,v))之间的最长边原创 2020-10-05 20:43:45 · 185 阅读 · 0 评论 -
POJ - 3694 Network(边连通分量缩点+dfn上朴素LCA+并查集动态缩点)
http://poj.org/problem?id=3694首先注意这个题中有重边。有重边的话除了vector<>外开一个map记录一下这个边有没有加过,如果加过了就不要再加了,会影响判断。注意poj中map的pair用列表初始化{}会CE,需要make_pair.普通做法当然就是每加一条边重新算一次桥,但这样复杂度将达到O(q*M).然后考虑缩点,缩完点后变成了一颗树。如果不懂边连通缩点先去看下上一篇博客(讲边缩点的)我们需要“动态地”在原图的基础上求桥。可以发..原创 2020-10-03 00:23:06 · 161 阅读 · 0 评论 -
E 1-Trees and Queries(思维+LCA+奇偶性)
题意翻译Description给定一个n个点的树,相邻点的距离为1。q个询问,每个询问包含无个整数:x,y,a,b,kx,y,a,b,k。含义是:在原树上新连上一条边(x,y)(x,y),要求判断一下从aa点是否有距离为kk的到bb的路径。注意: 每个询问是独立的,即上次询问加上的边,不能为这一次的询问所用。 这一条路径也许会重复经过某一条边或某一点。 Input第11行:nn;第2 \cdots n2⋯n行: 每行2...原创 2020-09-17 23:13:38 · 217 阅读 · 0 评论 -
P3379 【模板】最近公共祖先(LCA)
#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#define debug(a) cout<<#a<<"="<<.原创 2020-09-17 17:03:16 · 125 阅读 · 0 评论 -
LCA模板
源自网络树差分 & 倍增LCA// 链式前向星// maxn不要随便开很大 -> 容易MLEconst int maxn = 4e4 + 5;// 存无向边 -> 边要开两倍const int maxm = (maxn - 1) << 1;// 与maxn有关// 1e6 -> 21// 4e4 -> 17// 1e3 -> 11const int maxLog = 17;// 起始边int node[maxn];原创 2020-07-15 23:55:51 · 787 阅读 · 0 评论