【LCA】vijos1427机密信息

2024-09-01 11:48
文章标签 lca 机密信息 vijos1427

本文主要是介绍【LCA】vijos1427机密信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

Lorabit有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的你一定想到了,Lorabit的信息都是以文件夹名称的形式保存的。Lorabit给机密盘中的每一个文件夹都编了号,而Lorabit的机密信息是由S文件夹转到T文件夹的过程中必须经过的文件夹名称组合而成的(包括S和T),由于Lorabit的磁盘很慢,打开每个文件夹所耗费的时间等于该文件夹内下一级文件夹的数量。这次的任务是,给出每个文件夹的编号、名称以及它的父目录的编号和隐藏了Lorabit机密信息的起始文件夹编号和终点文件夹编号,你要计算出来的是Lorabit机密信息的长度以及寻找这个机密信息所需要的总时间。

格式

输入格式

输入文件的第一行为3个整数n、s、t,分别代表文件夹的个数、起始文件夹编号、终点文件夹编号,接下来n行,每行有2个整数i、pi和一个长度不超过255的字符串si(不包含空格),用空格分开,pi是i号文件夹的父目录编号(为0时表示该文件夹为根目录下的一级文件夹),si是i号文件夹的名称。

50%的数据是随机生成的;
60%的数据满足3<=n<=1000;
100%的数据满足3<=n<=10000、1<=i<=n、0<=pi<=n,保证一定有解。

输出格式

输出文件共2行,第一行是Lorabit的机密信息的长度,第二行是所消耗的时间。

样例1

样例输入1[复制]

6 1 5
1 2 Lo
2 3 ra
3 0 .
4 3 bi
5 4 t
6 5 .COM

样例输出1[复制]

8
4

限制

1 second

提示

假设你一开始就在初始文件夹位置,此时耗费的时间为0;你每打开一个文件夹,能够知道的文件夹名除了当前这个文件夹名之外,还有该文件夹内下一级的文件夹名。

来源

Conan From HNSDFZ


【题解】用了比较暴力的染色法 s回溯到根,t回溯直到遇到第一个被染过色的点,即为最近公共祖先

       

#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define maxn 10001char si[256];
int n,s,t,f[maxn],root,flag[maxn]={0},son[maxn],color[maxn],len[maxn];
int lenth,atime;int main()
{   scanf("%d%d%d\n",&n,&s,&t);int u,v,i;char c;for (i=1;i<=n;i++){scanf("%d%d%c%s\n",&u,&v,&c,&si);f[u]=v;flag[u]=1;son[v]++;len[u]=strlen(si);}for (i=1;i<=n;i++) if (!flag[i]){root=i; break;}int ts=s,tt=t;while (ts!=root){color[ts]=1;ts=f[ts];}while (!color[tt]){color[tt]=1;tt=f[tt];}root=tt;while (s!=root){lenth+=len[s];s=f[s];atime+=son[s];}while (t!=root){lenth+=len[t];t=f[t];atime+=son[t];}         lenth+=len[root]; atime-=son[root];//祖先节点时间重复加了一次要减去printf("%d\n%d\n",lenth,atime);
}

这篇关于【LCA】vijos1427机密信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126854

相关文章

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

【HDU】5574 Colorful Tree【子树染色,询问子树颜色数——线段树+bit+lca+set】

题目链接:【HDU】5574 Colorful Tree 题目大意:对一个子树染色,询问一个子树的颜色数。 题目分析: set set维护每种颜色所在的 dfs dfs序区间,修改均摊 nlogn nlogn。 #include <bits/stdc++.h>using namespace std ;typedef long long LL ;typedef pair < int , i

离线LCA学习

题目1 : 最近公共祖先·二 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁。远在美国的他们利用了一些奇妙的技术获得了国内许多人的相关信息,并且搭建了一个小小的网站来应付来自四面八方的请

【LCA】求最近公共祖先

算法一:在线算法 倍增 POJ1330 模板题 #include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include

poj 3694 Network(tarjan + LCA)

http://poj.org/problem?id=3694 题意:对于一个无向连通图,问加入某条边后,图中有桥的数目。 思路: 根据tarjan算法求出初始图的桥的数目,并用数组bridge标记桥的终点,在tarjan深搜树中求出每个节点的父节点(数组father表示)以及它们的深度,用于以后迭代求LCA。 因为加入某条边后,树中就会存在环,而环中的每条边都不再是桥,这就与求LCA

poj 1330 Nearest Common Ancestors(LCA模板)

http://poj.org/problem?id=1330 题意:给出两个点,求出这两个点最近的公共祖先。 求LCA的模板题。 大致思路就是访问到某个节点时,先将它自己加入集合中,然后递归访问它的子树,同时把子树加入到集合中来。子树搜索完毕后,判断该节点是否是输入的两个节点之一,若是,并且另外一个也已标记为访问过,那么另外一个节点的祖先便是他们的LCA。 #include<stdio

最近公共祖先(LCA),树上差分,树的直径总结

最近也是一不小心就学到了树论,这方面确实太不行了,也该开始学习一下了,那么话不多说,进入今日份的树论学习,直接开冲 最近公共祖先(LCA)——倍增思想(可以结合我之前写的ST表学习)   我们来看什么是最近公共祖先,对于9和8来讲,其最近公共祖先为6,对于3和7来讲,其最近公共祖先为5,那么我们去求最近公共祖先总共要有两步 第一步就是深搜,我们这一遍的深搜主要是为了去统计每一个点的深度

HDU 5150 UVALive 5061 (LCA标记)

这两题都是在树上求某一些路径上的点权的变化 两道题的思路相同 HDU 5150: 每一种颜色我们分开考虑他们对所有节点的贡献,对于颜色同为c的两个节点u和v(假设u!=v),那么在lca(u,v)的时候我们需要-1,因为在lca(u,v)一直到根的路径上,颜色c只能影响一次。基于此,我们对每种颜色的所有节点按照dfs序排好序,首先每个节点+1,然后对dfs序相邻的两个节点(注意颜色要相同)求

C++ P3379 【模板】最近公共祖先(LCA)

题目地址:https://www.luogu.org/problemnew/show/P3379 主要是用来作为参考代码的。 #include<cstdio>#include<iostream>using namespace std;int cnt=0,head[1000010],f[500010][21],d[1000010];struct Edge{int v,nxt;}e

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i