![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LCA
CCCCDEV_CCCC
志在四方少年,羡慕南飞的雁
展开
-
1613 跑路
1613 跑路这道题一说跑的步数是2k立刻就懂了,倍增这道题分三步进行解答:1.建图,这个步骤就是初始化,输入起点终点dis数组存储可以1秒达到,然后g[x][y][k]存的是x~y之间是不是存在一条2k的路径,所以我们得进行标记2.预处理这个步骤其实就是说将那些可以一秒达到的地方链接一下然后把距离设置成一秒也就是标记,然后做下面的操作3.最短路这些步骤一秒到达的地方直接跑一边最短路,也就是Floyd,小于50的数据floyd可以承受最后这道题就做出来了,不难想,挺好实现的#include&l原创 2021-05-04 20:06:08 · 60 阅读 · 0 评论 -
链表&邻接表
链表链表:链表支持任意位置插入删除,但是只能按以此的顺序进行查找,我们通常使用两个变量记录当前点前面的后面的点的节点,然后经常建立额为的两个节点head和tail代表链表头尾hou[qian[t]]=hou[t];qian[hou[t]]=qian[t];//数组模拟链表 a[a[t].qian].hou=a[t].hou;//指针指向 a[a[t].hou].qian=a[t].qian;//指针指向,类似出队 t=a[t].hou;//结构体模拟链表例题 邻值查找给定一个长度为n的原创 2021-04-24 10:52:58 · 211 阅读 · 0 评论 -
倍增
倍增 倍增,每次讲范扩大或者减少一杯达到加速的效果,倍增很像是二分的逆过程(自底向上的二分),二分是对一个很大的区间折半的查找看当前是否成立,是用一个值去对应区间,利用值不停的缩小区间,而倍增是利用二进制的思想用区间去对应一个值,一个区间一个区间的减少去逼近一个值,通常会用在树图上,他先干出一个假设的步数,就是2^k,再进行判断大还是小,从而决定 我们再来对倍增进行一个了解。 字面意思,成倍的进行增长,这里就是说如果我们的状态空间很大,线性递推无法满足时间空间的复杂度要求,那么我们就可以把任一整数表示原创 2021-04-21 22:04:44 · 103 阅读 · 0 评论 -
1554 异象石
1554 异象石题目说的,给定n个点n-1个边,那么肯定是一个树形结构当然,我是来练习LCA的,因为我感觉练习LCA有点少了地图上某一个点出现了异象石,地图上某个点的异象石被摧毁,向玩家询问所有异象石所在的联通点的的总长度的长度最小是多少可以看出来了是一个求LCA,这里不成一个常识,菊花图,表示任意一个点都和根节点有一条连边我们可以先对这棵树进行深度优先遍历,求出时间戳仔细考虑,瞎猜找规律就发现,如果我们按照时间戳从小到大的顺序,把出现异象石的节点排成一圈,并且累加相邻两个节点的路径长度,把出现原创 2021-08-11 15:00:36 · 260 阅读 · 0 评论 -
1552 点的距离
1552 点的距离我是来练习LCA的小菜鸡…每次询问x和y之间的距离,问的这么直接,估计是个模板题其实这个题非常的模板题,两个点的距离为两个点与LCA节点的深度之差所以我们需要维护节点深度和最近公共祖先然后套用公式就好了#include<cstdio>#include<algorithm>#include<iostream>using namespace std;const int SIZE=1e5+5;int n,q;int u,v;int t原创 2021-08-08 23:24:19 · 250 阅读 · 0 评论 -
1351 联合权值
1351 联合权值联合的权值最大是多少,权值之和最大是多少,动态规划,加上LCA,这是怕不是一个树形DP吧如是联合两个点距离是2,那么就得需要中间点,所以我们需要枚举中间点如果存在一个中间点,它的周围有两个点,权值分别为a,b则联合权值为2ab=(a+b)2-a(a2+b2)如果中间点的周围有三个点,权值为a,b,c那么联合权值为2ab+2bc+2ac=(a+b+c)2-(a2+b2+c2)综上所述,以某个节点为中转点的联合权值之和等于权值和的平方减去权值的平方和为了找到最大的联合权值,只需要找原创 2021-08-08 22:46:43 · 107 阅读 · 0 评论 -
树的重心中心直径LCA
树的重心也有许多的信息是自底向上进行统计的,比如每个节点x为根的子树大小对于一个节点x,如果我们把它从树中删除,那么原来的一棵树可能会分成若干个不相连的部分,其中每一部分都是子树,设maxpart函数表示在删除节点x后产生的子树中,最大的一颗的大小,那么x就是重心void dfs(int x){ v[x]=1; size[x]=1;//假设子树的大小 int maxpart=0;//假设,预处理 for(int i=head[x];i;i=next[i]) { int y=edge[i原创 2021-05-04 17:09:01 · 291 阅读 · 0 评论 -
2420 让我们异或吧
2420 让我们异或吧#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<string>using namespace std;int n;int head[200000];int depth[200000];int f[200000][18][2];//f[i][j][0]表示从原创 2021-08-08 21:42:43 · 67 阅读 · 0 评论