![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LCA
Love_xyh
这个作者很懒,什么都没留下…
展开
-
CF342E Xenia and Tree
首先思考一下暴力怎么写:(有以下两种很明显的方法)1.把每个不断得到的红点都存储下来,对于后面的每个询问,与每个红点通过lca求得点距,取最小值。2.每得到一个红点,就对于整棵树做一次bfs,更新树中每个点到最近红点的距离。我们发现,如果红点数量为n/2个,询问数量为n/2个,那么两种暴力思想都会被卡。那么我们就把红点分个块来处理吧。假设红点数量和为S。将红点分为sqrt(S)个块,每个块内sqrt(S)个红点。当每得到一整个块个数的红点时(即sqrt(S)),就对整棵树做一次bfs。复杂度:原创 2020-07-22 21:50:29 · 289 阅读 · 1 评论 -
CF613D Kingdom and its Cities
重点在树形dp。dp[u]:u为根的子树的答案最小值对于有些只有一个重要节点的子树,可以暂时保留这个节点 ,等到不得已必须处理时再处理,可以使得答案更优所以再记录一个g[u]:u为根的子树,当答案最小时,还剩下没处理好的节点个数#include <bits/stdc++.h>using namespace std;const int N=1e5+5;int n,u,v,q...原创 2020-03-19 10:35:57 · 120 阅读 · 1 评论 -
BZOJ 3611:Heoi2014 大工程
原来最长链用的都是两边dfs求直径或用两个数组存最长链和次长链,今天学习了,如果只需要求出直径大小,别的什么都不用,那么只用一个数组进行dp更加方便。void DP(int u){ //f2[u]:最短链 f3[u]:最长链 if (vis[u]) f1[u]=1,f2[u]=0,f3[u]=0; else f1[u]=0,f2[u]=1e18,f3[u]=-1e18; for ...原创 2020-03-19 10:34:03 · 150 阅读 · 0 评论 -
BZOJ 2286:Sdoi2011消耗战
也是新学虚树,所以只能简单介绍下。想必大家都知道离散化,虚树可以理解为树上的离散化,这样处理,对于一些询问次数比较多,原树比较大的题,我们就可以尝试建立出虚树,并在虚树上进行操作。而虚树作为一个工具,一般会和树形dp或树上贪心结合在一起。很幸运看了yyb的博客后,发现了很简便的建虚树的方法,此题建好虚树后,一个基础树形dp即可。#include <bits/stdc++.h>...原创 2020-03-19 10:28:53 · 128 阅读 · 0 评论 -
BZOJ 2588: Count on a tree
加个dfs序就可以把静态kth移到树上来做。树上差分一下即可。顺便再多写一个dfs用以树剖求lca。#include <bits/stdc++.h>using namespace std;const int N=1e5+5;int n,q,m,u,v,t,LCA,cnt,last;int ll[N<<5],rr[N<<5],sum[N<<...原创 2020-03-10 21:29:14 · 120 阅读 · 0 评论 -
[USACO08OCT]牧场散步Pasture Walking
深夜水题二刷祭。如果把颓知乎的时间都用来打模板,相信模板一定能打的很快吧。注意由于边权不是1,所以要重新开一个dis数组记录距离,但是记录深度的d数组不能省。#include <bits/stdc++.h>using namespace std;const int N=1e3+5;int n,m,u,v,w,x,y;int d[N],dis[N],p[N][21];in...原创 2020-02-22 01:34:06 · 173 阅读 · 0 评论 -
CF1296F Berland Beauty
利用贪心的思想进行构造,然后检验。注意到在一棵树中,一个节点最多只有一个根节点,所以可以把边权转化为点权来存储:一个点与它父节点之间的边的权值,存储在它的身上即可。5000的数据就是用来暴力跳lca的。#include <bits/stdc++.h>using namespace std;const int N=5e3+5;int n,u[N],v[N],m,now;in...原创 2020-02-10 23:59:35 · 183 阅读 · 0 评论 -
LCA模板解释与树上差分介绍
倍增求LCA对于树上求两个节点的最小公共祖先,很明显,可以通过从这两个点一步步往上走,得到一个相同的节点,那么这个节点就是所要求的最小公共祖先了。但是,这种暴力,明显会T。那么,既然我们可以通过一步步往上爬,是不是也可以两步两步往上爬,三步三步,甚至一百步一百步呢?记得杰伦有首歌叫《蜗牛》-----我要一步一步往上爬既然有这样一种一次往上爬多步的思想在了,那么,距离一次是爬几步呢?我们发现,...原创 2019-05-06 20:01:21 · 208 阅读 · 0 评论 -
利用LCA的一些简单查询操作
利用lca的一些模板有很多模板,是要运用lca的,下面我来记录几个。模板:求树上两点间的距离那么,不就是先把所有点到根节点的距离求出后,找一下这两点的lca,得到答案吗???代码:// 树上两点之间的距离,设两点为a,b,那么它们之间距离就是 dis[a]+dis[b]-2*dis[lca(a,b)] #include <bits/stdc++.h>using name...原创 2019-05-07 09:46:46 · 385 阅读 · 0 评论 -
BZOJ 3626: [LNOI2014]LCA
帮助复习了树剖的基本操作。需要考虑一下lca最近公共祖先的最原始的性质,这样就可以来用树剖加线段树维护了。但是这样是个傻逼复杂度:nlognlogn*q,我们需要把q去掉,所以就离线做一遍,利用前缀和,差分一下即可。和gss2的离线思路差不多类似,可以算作一种套路吧。吐槽:一个晚上就做了一道题???我还是太菜了呀…明明有时间的,但是做完一题整个人就痿了???…#include <...原创 2020-01-17 23:07:34 · 120 阅读 · 0 评论