
LCA
Chester_King
虽千万人,吾往矣。
展开
-
【洛谷】3379 【模板】最近公共祖先(LCA)
题目传送门诶,自己真的是越来越菜了,自己寒假里学会的LCA到现在已经忘得差不多了。今天就当是复习一下吧。其实这个倍增的思想还是挺神奇的,每次询问时先把深度较大的节点倍增到和深度较小的节点同一深度。然后再把这两个节点同时倍增到离它们最远的不相同的祖先出,赋值并循环,最后返回当前任意一个节点的父亲节点就是这两个节点的LCA了。附上AC代码:#include #include原创 2017-06-07 13:00:23 · 887 阅读 · 0 评论 -
【BZOJ】3732 Network 最小生成树+LCA
题目传送门挺有意思的一道题呢……至少,最小生成树+LCA的思想就非常棒。首先,对于所有给出的边做一遍最小生成树,删去最小生成树以外的边。然后,将最小生成树这棵无根树转化成有根树,当然还是树的重心。在建立有根树的同时记录当前节点倍增到当前祖先路径上的最大值。最后,对于每一次询问,做一遍LCA,同时统计所有倍增时的最大值,即为答案。附上AC代码:#include #inc原创 2017-06-09 20:32:35 · 412 阅读 · 0 评论 -
【BZOJ】1977 [BeiJing2010组队]次小生成树 Tree kruskal+LCA
题目传送门这题好像在好久以前就讲过啊……为什么我现在才去做……其实正解挺好想的,首先做一棵最小生成树,然后枚举一条非树边,显然这条非树边的加入可以使原本树上的唯一路径形成一个环,把这个环上严格第二小的边删掉,就是一棵严格次小生成树了。然后对所有的次小生成树求一个最小权值即可。至于怎么查找原来的唯一路径上的严格次大值,可以用ST表维护最大值和次大值。附上AC代码:#include <cstdio>#原创 2017-11-28 19:48:04 · 257 阅读 · 0 评论 -
【BZOJ】3631 [JLOI2014]松鼠的新家 LCA+树上差分
题目传送门再水一篇blog,可能也是我专门去学树上差分的最后一题吧。一开始拿到题目,并没有想到树上差分的做法,看了题解之后:原来差分还可以这么用的啊,又学到了一种黑科技。对于相邻的两个房间,直接和“【BZOJ】4390 [Usaco2015 dec]Max Flow”这题一样差分就好了。(真的就好了吗?)重新考虑一下,发现从第ii个房间走到第i+1i+1个房间和从第i+1i+1个房间走到第i+2i+原创 2017-10-22 20:42:18 · 270 阅读 · 0 评论 -
【BZOJ】4719 [Noip2016]天天爱跑步 LCA+树上差分
题目传送门曾今考过的一场模拟赛中的题目,当时的我只会打暴力,还是那种非常低级的暴力,连8080分都没有……这题的正解是LCALCA+树上差分。观察题目给出的子问题,20%的数据起点为1,20%的数据终点为1。根据这些信息我们想到了什么?没错,把一条路径分成stst到lcalca的路径和lcalca到eded的路径。考虑一个在stst到lcalca的路径上的观察员ii观察到了这个人,可以得到等式dee原创 2017-10-18 16:01:35 · 389 阅读 · 0 评论 -
【BZOJ】4326 NOIP2015 运输计划 二分+LCA+树上差分
题目传送门有了之前的铺垫,突然发现这题还是挺水的诶。(逃)题目要求最大时间的最小值,想到了二分,但是怎么去判断二分出来的值呢?我们开两个数组sumsum和vv,sumsum数组表示每条边的标记值,vv表示每条边的权值。我们把这两个本来是边的值转化到每条边深度较大的节点上,这个显然没有对答案产生影响,并且可以简化代码。现在我们要判断二分出来的值midmid,显然路径的权值和w≤midw \leq mi原创 2017-10-17 21:44:49 · 232 阅读 · 0 评论 -
【BZOJ】4390 [Usaco2015 dec]Max Flow LCA+树上差分
题目传送门树上差分是个好东西,“可以让复杂的题目变的简单许多”——来自ZZK。先切一道比较裸的树上差分,为接下来的“NOIP2015运输计划”做准备。这题题意非常清楚,给定一棵树,每次给一条路径上所有点权加一,求所有操作后的最大点权。考虑树上差分,每次在给定的两个点xx和yy上打上+1+1的标记,在lca(x,y)lca(x,y)和lca(x,y)lca(x,y)的父亲上打上−1-1的标记。最后遍历原创 2017-10-17 18:34:04 · 247 阅读 · 0 评论 -
【洛谷】1967 [noip2013]货车运输 最小生成树+LCA
题目传送门这题和上一题的解题思路是一模一样的,也是先对给出的边做一遍最小生成树,哦不对,这题是最大生成树。然后还是把无根树转化成有根树,求每个点的倍增祖先。然后,这题的判断有点特殊,其实也挺简单的,可能是我为了中考失了智吧……就是判断给出的两个节点的祖先是否相同,若不同,则输出-1;若相同,则输出这两个节点到它们LCA的路径上的最小边权。其他只要想进去就挺简单的,总之细心一点吧原创 2017-06-13 16:55:07 · 374 阅读 · 0 评论 -
【BZOJ】1787 [Ahoi2008]Meet 紧急集合 LCA
题目传送门这题还是挺好的,至少我困扰了我一段时间。首先把这棵无根树转化成一棵有根树,根是什么,树的重心吧。(如果数据过小,直接定义第1号节点为根就行了)然后倍增所有节点,得到所有节点和祖先的关系。最后,要求3个点的树上最短距离,那么集合点一定是其中两个节点的LCA。(画画图就秒懂了)最暴力的方法就是枚举3个节点的LCA,然后判断距离和最小的为集合点。但是,有一种神奇的方法:原创 2017-06-08 20:11:07 · 321 阅读 · 0 评论 -
【BZOJ】2588 Spoj 10628. Count on a tree LCA+主席树
题目传送门如果是强制在线的话,那就只能用主席树了。这题的主席树建立方法也是挺好的,每个节点向它的父亲节点建立主席树。对于每个询问(x,y)(x,y),抓住x,y,lca(x,y),father[lca(x,y)]x,y,lca(x,y),father[lca(x,y)]这四个点,初始化这四个点在各自主席树的根部,然后用二分加容斥来更新这四个点在各自主席树上的位置——选择左儿子或右儿子,最后得到答案。原创 2017-12-18 21:19:30 · 245 阅读 · 0 评论