
最近公共祖先
wanherun
今天会有好事发生吗
展开
-
bzoj1602 [Usaco2008 Oct]牧场行走
题目LCA模板题。在树上求两个点之间的距离,可以用类似差分的方法。设dis[i]表示结点i到根的距离,那么s到t的距离为:dis[s]+dis[t]-2*dis[lca(s,t)]; lca(s,t)表示它们的最近公共祖先。#include<bits/stdc++.h> #define N 2000 using namespace std; int n,q,x,y,z; int first[N+5]原创 2017-11-09 14:19:33 · 248 阅读 · 0 评论 -
[noip2013]货车运输 题解
一句话题意就是求A到B的路径中的最小值最大,是不是有一种一眼二分的奇妙感觉,但是,我们显然二分不了呀。仔细想一想,最大,答案一定是出现在最大生成数上的。好了,我们就可以先求一遍最大生成“树”,打引号是因为它们不一定都是联通的,事实上是,最大生成森林。然后对于每一个询问,我们可以倍增地求出最小值。这样的话,就解决这道题了。#include<bits/stdc++.h> #define N 100000原创 2017-10-25 23:22:23 · 341 阅读 · 1 评论 -
[noip2016]天天爱跑步 题解
哎,最难第一道题了,昨天才刚刚刚出来,但其实还是有些不太理解,就把自己的想法写一下,说不定哪儿天就融会贯通了呢。设每一条道路的起点为S,中点为T,它们的lca(最近公共祖先)为LCA,那么,就是求S到lca上dep[x]+w[x]==dep[S](由dep[S]-dep[x]==w[x]变形可得)的数量,lca到T是类似的,不过有一个减号,为了让它变为正,加一个数就好了,具体为dep[x]-w[x]原创 2017-10-20 23:29:12 · 1448 阅读 · 0 评论 -
bzoj4719 [Noip2016]天天爱跑步
题目noip真题,支持呀,先再洛谷上交了一发,再过来水水。。#include<bits/stdc++.h> #define N 1000000 using namespace std; int n,m,x,y,lc,tmp,w[N+5],b; int f[N+5][25],dep[N+5],ans[N+5]; int first[N+5],nxt[N+5],to[N+5],siz; int fir原创 2017-10-19 23:53:08 · 174 阅读 · 0 评论 -
bzoj1787 [Ahoi2008]Meet 紧急集合
题目如果只有两个人,就当然是水题了,只要找出lca就可以了。 那么,三个人呢。其实原理上应该是差不多的,先两两找出lca,得到三个lca,感性的认识一下,答案一定在这三个点之间,枚举一下就好了。其实,还可以优化一下,我们可以发现,三个lca,一定有两个是相同的,那么,答案就是另一个。#include<bits/stdc++.h> #define N 500000 using namespace s原创 2017-09-10 19:34:15 · 246 阅读 · 1 评论