首页 > TAG信息列表 > P3398
P3398 仓鼠找sugar
很基础的lca题。 关键是弄明白什么时候两人会相遇,即什么情况下a-b与c-d的路径会相交 首先默认dep[a]>dep[b],dep[c]>dep[d], 那么一共有四种情况相交 if(lca(a,lca2)==lca2&&lca3==lca1) flag=1; if(lca(b,lca2)==lca2&&lca3==lca1) flag=1; if(lca(c,lca1)==lca1&&lca3==lcaP3398 仓鼠找sugar
LCA的基本操作, 判断两条路径是否相交,如果相交,记 x=lca(a,b),y=lca(c,d),则必有x在c~d路径上或y在a~b路径上 若有一个点在某条路径上,那么该点到路径两端点的距离和等于两端点的距离,距离用lca和深度就可以了 #include<cstdio>#include<iostream>#include<cmath>using namespace std;洛谷 P3398 仓鼠找sugar
洛谷 P3398 仓鼠找sugar Description 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以洛谷 P3398 仓鼠找sugar 题解
先说一下题意: 在一颗树上一个仓鼠从a走到b,一个他的基友从c走到d求他两个是不是会有相遇的地方。 一道求lca的题目。 这道题只看题目是很难找出规律的,但是一画图他的规律就很显然了 可以发现如果两条路径如果相交那一对点的最近公共祖先一定在另一台的路径上 不然如果相交那就这能洛谷p3398仓鼠找suger题解
我现在爱死树链剖分了 题目 具体分析的话在洛谷blog里 这里只是想放一下改完之后的代码 多了一个son数组少了一个for 少了找size最大的儿子的for #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 100100;int n, qLuogu P3398 仓鼠找sugar
传送门 我居然把swap写成了switch 如果路径相交,那么一定有LCA(a,b)在路径c,d上,或LCA(c,d)在路径a,b上 如果x在路径a,b上,需要满足条件: dpth[x] >= dpth[LCA(a,b)] LCA(a,x)=x 或 LCA(b,x)=x 就这样,求出LCA后分别判断一下即可 代码如下 #include<cstdio>#include<iostream>#incP3398 仓鼠找sugar
题目意思很清楚,求树上两条路径是否相交。 乱模拟就可以发现规律:当一条路径的lca在另外一条路径上的时候,这两条路径相交。 证明方法从题解的讨论里面看来的“浮尘ij”dalao摘过来: 可以反证,(不考虑两个lca相同的情况)两个lca到交点各有一条路径,他们到根节点又各有一条路径,出现环,矛盾。