
树上倍增
文章平均质量分 75
Frozen_Guardian
已退役菜鸡Acmer
展开
-
HDU - 7091 重叠的子串(后缀自动机+set启发式合并+树上倍增)
题目链接:点击查看题目大意:给定一个只含小写字母的字符串 sss 和 qqq 次询问,每次询问给定一个字符串,以 s[l..r]s[l..r]s[l..r] 的形式给出,判断 sss 中是否存在两个或多个出现的有重叠部分的给定子串。比如在 “ababa”“ababa”“ababa” 中,两个 “aba”“aba”“aba” 子串就重叠于中间的字母 “a”“a”“a”,而两个 “ab”“ab”“ab” 子串就没有发生重叠。TTT 组数据。题目分析:对字符串 sss 建立 SAMSAMSAM 然后建出 pa原创 2021-08-21 23:12:53 · 307 阅读 · 0 评论 -
2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)
题目链接:点击查看题目分析:刚看到这个题目的时候,口胡了一个假算法,觉得对于每次询问的操作 [l,r][l,r][l,r] ,只需要找到指令集区间 [l,r][l,r][l,r] 内覆盖到点 kkk 的最大并集,然后求出这段区间中 aaa 数组的最大值就是答案了,这样一来直接用线段树维护一下数组 aaa,再用主席树维护一下区间交集即可但后来转念一想,覆盖的区间还有时序问题,也就是两个区间执行的先后顺序不同,会造成不一样的结果,到此为止这个题也就卡住了今天看了题解和杨大佬讨论了一下就豁然开朗了,其实卡.原创 2021-06-07 18:43:09 · 552 阅读 · 2 评论 -
CodeForces - 1535E Gold Transfer(树上倍增+交互)
题目链接:点击查看题目大意:给出一棵初始时只有一个点的树,每个点都有两个值:ai,cia_i,c_iai,ci,分别代表黄金的个数和单价。需要执行 mmm 次操作,每次操作分为两种类型:1 pi ai ci1\ p_i\ a_i\ c_i1 pi ai ci添加一个新点 iii,pip_ipi 为其父节点,ai,cia_i,c_iai,ci 如上一段所述,保证 ci>cpic_i>c_{p_i}ci>cpi原创 2021-06-06 16:02:03 · 315 阅读 · 0 评论 -
CodeForces - 1516D Cut(思维+倍增)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列 aaa ,现在需要回答 mmm 次询问,每次询问给出一段区间 [l,r][l,r][l,r],需要回答最少需要将区间切分成几段,才能使得每一段区间中的 lcmlcmlcm 等于其自身的乘积题目分析:首先需要分析出 "lcmlcmlcm 等于其自身的乘积" 这句话的含义,其意义实际上就是,对于同一段中的所有数字来说,任意一个质因子,至多只能在一个位置中做出贡献然后就是一个不难看出的贪心:从某个位置 lll 作为起点,对于后续连续的每个数字来说,原创 2021-05-12 19:56:43 · 327 阅读 · 0 评论 -
CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)
题目链接:点击查看题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树题目分析:考虑求解次小生成树的思路:求出最小生成树 ans 枚举每一条非树边 ( u , v ),然后删除树上 ( u , v ) 这条路径上的最大值,即此时生成树的答案变为 ans +w( u , v ) - mmax 选择次小的作为答案所以在求出最小生成树后,对于每一条边来说,只需要求出路径上边权的最大值即可可以用树剖+线段树硬写,因为本题是静态的一棵树,所以用树上倍增在时间复.原创 2020-11-18 16:29:15 · 306 阅读 · 2 评论 -
牛客 - Colorful Tree(dfs序+LCA)
题目链接:点击查看题目大意:给出一棵 n 个节点构成的数,每个节点都有一个颜色,现在需要执行 m 次操作,每次操作分为如下两种类型:Q x:回答所有颜色为 x 的节点构成的连通子图含有的最少边数 U x y:将点 x 的颜色修改为 y题目分析:一种没见过的模型,想了一下午没想明白原理,是我菜了,所以只记录一下如何实现吧求出整棵树的 dfs 序,将每个颜色的节点按照 dfs 序维护,对于每个节点 x 来说,设 l 为 dfs 序小于 x 的最大节点,r 为 dfs 序大于 x 的最小节点,mm原创 2020-10-07 17:28:45 · 773 阅读 · 0 评论 -
(转)LCA模板(倍增法)
插眼:点击查看用法:求树上两个节点的公共祖先代码:const int N=1e5+100;int n;//节点个数int k=log2(n)+1;int dp[N][20];//倍增法int deep[N];//每个节点的深度void dfs(int u,int fa){ deep[u]=deep[fa]+1; dp[u][0]=fa; for(int i...转载 2019-11-04 11:26:18 · 286 阅读 · 0 评论 -
洛谷 - P4768 [NOI2018]归程(Kruskal重构树+树上倍增+最短路)
题目链接:点击查看题目大意:去原网址看吧题目分析:因为是在刷克鲁斯卡尔重构树的题目,所以稍微思考一下就能想出解法了,首先如果水位线固定了,剩下的边组成的最小生成树也是一定的,此时同一个连通块内的点对答案的贡献都是相同的,因为车子可以随便开,这样连通块的贡献,就是连通块内距离点 1 最近的点了这样如何找相应的连通块呢?可以对所有边降序排序,建立克鲁斯卡尔重构树,对于点 x 来说,找到权值大于水位线,且深度最小的祖先,这一步可以用树上倍增来完成,此时这个祖先的子树中的点两两都可以互相达到了,显然包括原创 2020-08-23 21:17:12 · 265 阅读 · 0 评论 -
牛客多校4 - Ancient Distance(树上倍增+dfs序+线段树)
题目链接:点击查看题目大意:给出一棵 n 个节点且以点 1 为根节点的的树,现在给出一个 k ,需要在树上选择 k 个关键点,使得 n 个点到达根节点的路径上,出现的最近的关键点的距离的最大值最小,现在需要输出 k 分别为 1 ~ n 时的答案之和题目分析:首先理解题意,这个题目中有且仅由一个思维点需要转换过来,那就是直接计算 k 值下的答案是很难计算的,但是我们可以在某个答案下,贪心去计算 k 的值怎么理解上面这段话呢?对于某个答案 x 来说,因为 x 是题目中所有距离最大值的最小值,换句话说原创 2020-07-26 02:40:52 · 339 阅读 · 0 评论 -
CodeForces - 1328E Tree Queries(dfs序/LCA)
题目链接:点击查看题目大意:给出一棵以点 1 为根节点的树,接下来有 m 次询问,每次询问给出 k 个点,题目问我们能否找到一个点 u ,使得从根节点到点 u 的简单路径,到 k 个点的每个点的距离都小于等于 1题目分析:我的第一反应是用lca,仿照bfs那样,逐层询问每两个点之间的lca,但是不太会操作,队友和我说可以随便找一条最长的链然后检查,不过复杂度顶不住,赛后补题的时候,想到了...原创 2020-03-27 02:44:54 · 680 阅读 · 0 评论 -
CodeForces - 1301E 1-Trees and Queries(LCA)
题目链接:点击查看题目大意:给出一棵树,再给出 m 次询问,每次询问给出 x , y , a , b , k ,问如果在点 x 和点 y 之间添加一条边,那么能否从点 a 到点 b 恰好走 k 条边到达,树上的边和点都可以重复经过题目分析:读完题后没什么思路,但其实稍微转换一下题意就变的非常简单了,题目要求恰好经过 k 条边从点 a 到达点 b ,那么我们思考一下有哪些途径可以从点 a 到...原创 2020-02-16 01:27:55 · 336 阅读 · 0 评论 -
CodeForces - 932D Tree(树上倍增,好题)
题目链接:点击查看题目大意:给出一棵树,初始时只有一个节点1,权值为0,后续有 n 个操作,每次操作分为两种情况:1 u val:向树中插入一个新的节点,其父节点为 u ,权值为 val 2 u val:询问以节点 u 为起点的最长不下降子序列的长度,这里规定的最长不下降子序列需要满足以下几个条件: 以 u 为起点,每次的路线必须都是当前节点的父节点 序列中的权值和小于等于 val...原创 2020-01-23 17:49:22 · 467 阅读 · 2 评论 -
POJ - 3694 Network(边双缩点+LCA+并查集优化)
题目链接:点击查看题目大意:给出一个由n个点组成的无向图,现在有m次操作,每次操作都会向图中增加一条无向边,每次操作后询问当前图中有多少个桥题目分析:题意很好理解,思路也很好想,就是代码量有点小多(好几个模板拼拼凑凑出来的)既然提到桥了,那么肯定先强连通缩一波点,将图重构成一棵树,求出原图中有多少个桥,随后每次操作都会加边,如果新边的两个端点属于同一个强连通块中,那么不会对答案做出贡献...原创 2019-12-24 00:48:24 · 275 阅读 · 0 评论 -
HDU - 2874 Connections between cities(并查集+LCA)
题目链接:点击查看题目大意:给出n个点代表城市,再给出m条边将其连接,每条边都有边权,题目保证给出的图无环,现在给出两个点,首先询问两个点是否互相连通,若可以连通,询问两点之间的距离题目分析:判断连通我们直接用并查集维护分块就好了,因为是无向图,所以最后对于每个分块随便选一个点当做根节点跑一遍dfs维护一下树上前缀和,最后就可以直接判断了,算是一个模板题吧,比较简单代码:#inc...原创 2019-12-02 00:50:01 · 352 阅读 · 0 评论 -
HDU - 4547 CD操作(LCA模板)
题目链接:点击查看题目大意:给出一个层层嵌套的树状结构,可以从某一点通过一个操作直接到达任意一个子节点的位置,但如果要从某个节点到达其祖先节点需要一层一层往上爬,问若要从节点A到达节点B,需要多少步题目分析:LCA模板题,需要修改的地方就是当节点B就是LCA的时候特判一下,然后直接用deep数组计算就行了注意一下多组输入map记得清零,一开始忘清零,MLE了两发。。太蠢了代码:...原创 2019-12-02 00:42:07 · 328 阅读 · 0 评论 -
HDU - 2586 How far away ?(LCA)
题目链接:点击查看题目分析:给出n个节点组成的一棵树,每条边都有一个权值w,现在给出m个询问,每次询问需要回答点x到点y之间的距离之和题目分析:因为看到了两点之间的距离之和,一开始是想直接上树链剖分,然后线段树维护的,但转念一想,其实可以直接用一个树上前缀和来维护的,dfs的时候顺便把前缀和维护一下,sum[v]=sum[u]+w,表示的是节点v到根节点的前缀和,虽然题目给出的是一个无根树...原创 2019-11-27 12:21:57 · 220 阅读 · 0 评论 -
HDU - 5452 Minimum Cut(LCA+树上差分)
题目链接:点击查看题目大意:给出n个点,n-1条边组成一棵树,然后再给出m-n-1条边,组成一个图,现在要让我们求最少删去几条边才能让整个图不连通,并且要求只能在树上删去最多一条边题目分析:这个题目的意思有点难懂,大概就是需要删边,删去最少的边让整个图不连通,当我们在一棵树上继续加边的话,必定会形成环,假如我们想让u-v这里出现断点,那么我们就需要将u-v这条边在树上删去,然后再将与u和v...原创 2019-11-12 17:48:02 · 362 阅读 · 0 评论 -
SPOJ - COT Count on a tree(LCA+主席树+离散化)
题目链接:点击查看题目大意:给出一棵树,每个点都有一个权值,现在给出m个询问,每次询问的格式是u,v,k,要求输出u-v这条路径上第k大的数题目分析:一看到第k大的数就会想到主席树,既然是在树上的操作,我们就需要用lca先把u-v这条路拿出来,具体的还是用树上倍增来实现,然后在dfs的过程中建立一棵可持久化的线段树,也就是主席树,在查询的时候就可以直接对于u-lca-v这条路上直接查询了,...原创 2019-11-08 02:11:35 · 344 阅读 · 0 评论 -
计蒜客 - Distance on the tree(LCA+主席树)
题目链接:点击查看题目大意:给出一颗含有n个节点的树,每条边都有权值,现在给出m个询问,每次询问的格式为u,v,w,我们需要求出在路径u-v上,边权小于等于w的边的个数题目分析:多的不说了,上一个博客都写的差不多了,这次来挂一发主席树+LCA的代码,LCA我觉得树上倍增的好写,反正写起来不容易错,然后前两天学会了可持久化字典树之后,再回头看主席树也觉得简简单单了对了,注意一下主席树的大...原创 2019-11-08 00:50:02 · 200 阅读 · 0 评论 -
CodeForces - 208E Blood Cousins(树上倍增+二分/树上启发式合并)
题目链接:点击查看题目大意:给出n棵树,再给出m个询问,每次询问给出两个整数u和k,先假设u在k层之上的祖先是p,问与u在同一层深度,并且公共祖先都是p的节点有多少个题目分析:因为先要求出u在第k层之上的祖先,我们可以利用树上倍增很简单的求出,但接下来的操作我是没想到的,虽然鲲学长已经给了提示需要二分,我也看出了直接dfs暴力找肯定会T掉的,但没设计出合适的二分来处理这个题,憋不住去网上看...原创 2019-11-07 19:11:03 · 522 阅读 · 0 评论 -
SPOJ - QTREE2 Query on a tree II(LCA)
题目链接:点击查看题目大意:给出一棵无根树,每条边都有权值,接下来有数次操作,每次操作分为两种类型: DIST x y:求出点x到点y的唯一路径上的权值和 KTH x y k:求出点x到点y的唯一路径上第k个点 题目分析:因为是无根树,所以我们随便找个节点当根就行了,为了方便,我们每次都选取第一个点当根节点,接下来对于操作1,我们在树上求一遍前缀和即可,对于操作2,涉及...原创 2019-11-07 17:45:33 · 213 阅读 · 0 评论 -
POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)
题目链接:点击查看题目大意:给出一棵有根树,我们需要求出两个点的lca题目分析:因为题目说了是有根树,所以我们在建图的时候直接建有向图就好了,并且记录一下每个点的入度,建完图后找一下入度为0的点,就是根节点了,然后建树,就可以直接套模板求lca了,这里挂两个模板,一个是树上倍增,一个是树链剖分,都写了一下练练手:树上倍增:#include<iostream>#inc...原创 2019-11-07 17:26:35 · 285 阅读 · 0 评论 -
HDU - 4757 Tree(LCA+可持久化trie树)
题目链接:点击查看题目大意:给出一棵有有n个节点的树,每个点都有一个权值,现在给出m个查询,每次查询的形式为:x,y,z,求出从点x到点y的路径上任选一点,使其与z的异或值最大,输出异或值题目分析:一开始看到从一个区间内任选一个点与指定的值异或取最值,立马就想到了可持久化trie树,可是这个题目是基于树上操作的,我们该怎么将树上的路径拿下来呢?其实这就涉及到了LCA,在给出两个点x和y后,...原创 2019-11-04 15:36:45 · 267 阅读 · 0 评论