NC24263 USACO 2018 Feb G]Directory Traversal
题目
题目描述
奶牛Bessie令人惊讶地精通计算机。她在牛棚的电脑里用一组文件夹储存了她所有珍贵的文件,比如:
bessie/
folder1/
file1
folder2/
file2
folder3/
file3
file4
只有一个“顶层”的文件夹,叫做bessie。
Bessie可以浏览任何一个她想要访问的文件夹。从一个给定的文件夹,每一个文件都可以通过一个“相对路径”被引用。在一个相对路径中,符号“..”指的是上级目录。如果Bessie在folder2中,她可以按下列路径引用这四个文件:
../file1
file2
../../folder3/file3
../../file4
Bessie想要选择一个文件夹,使得从该文件夹出发,对所有文件的相对路径的长度之和最小。
输入描述
第一行包含一个整数N(2≤N≤100,000),为所有文件和文件夹的总数量。为了便于输入,每个对象(文件或文件夹)被赋予一个唯一的1至N之间的ID,其中ID 1指的是顶层文件夹。
接下来有N行。每行的第一项是一个文件或是文件夹的名称。名称仅包含小写字母a-z和数字0-9,长度至多为16个字符。名称之后是一个整数m。如果m为0,则该对象是一个文件。如果m>0,则该对象是一个文件夹,并且该文件夹下共有m个文件或文件夹。在m之后有m个整数,为该文件夹下的对象的ID。
输出描述
输出所有文件的相对路径的长度之和的最小值。注意这个值可能超过32位整数的表示范围。
示例1
输入
8
bessie 3 2 6 8
folder1 2 3 4
file1 0
folder2 1 5
file2 0
folder3 1 7
file3 0
file4 0
输出
42
说明
这个输入样例描述了上面给出的样例目录结构。
最优解是选择folder1。从这个文件夹出发,相对路径分别为:
file1
folder2/file2
../folder3/file3
../file4
题解
知识点:树形dp。
考虑树形dp,二次扫描+换根法。
设 \(Size[u]\) 表示为以 \(u\) 为根的子树叶节点数,\(f[u]\) 表示以 \(u\) 为根的子树的路径总长度(\(u\) 文件名不包括在路径中)。转移方程为:
\]
表示 \(v_i\) 子树下所有叶子节点的路径长度(不包括 \(v_i\) 文件名)\(f[v_i]\) ,都加上一段到文件夹 \(v_i\) 的长度 \(a[v_i]+1\) (文件名加一个斜杠)。
随后把通过子树的答案处理成整个树的答案,设 \(ff[u]\) 表示为以 \(u\) 为起点的路径总长度。转移方程为:
\left \{
\begin{aligned}
&ff[u] - Size[v] \cdot (a[v] + 1) + 3 \cdot (Size[1] - Size[v]) & &,v不是叶子节点\\
&\inf & &,v是叶子节点
\end{aligned}
\right.
\]
叶子节点不能作为起点直接赋值无穷大,不影响其他节点求值,还方便最后处理最小值。可以通过 \(f[v] = 0\) 来判断是叶子节点,也可以 \(g[v].size = 1\) 来判断。
非叶子节点可以作为起点。当起点从 \(u\) 改到 \(v\) , \(v\) 子树的叶子节点需要减去 \(v\) 的文件名长度 \(Size[v] \cdot (a[v]+1)\),其他叶子节点需要加上从 \(v\) 回溯到 \(u\) 的路径 ../ 长度 \(3 \cdot (Size[1]-Size[v])\) ,最后就得到 \(ff[v]\) 的答案。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100007];
vector<int> g[100007];
ll Size[100007], f[100007], ff[100007];///以u为根的子树叶节点数,以u为根的子树的路径总长度,以u为起点的路径总长度
ll ans = ~(1LL << 63);
void dfs1(int u, int fa) {
for (auto v : g[u]) {
if (v == fa) continue;
dfs1(v, u);
Size[u] += Size[v];
f[u] += f[v] + Size[v] * (a[v] + 1);///每条到叶子的路径加名字长度+一个斜杠,斜杠答案时候能删掉
}
}
void dfs2(int u, int fa) {
for (auto v : g[u]) {
if (v == fa) continue;
if (f[v]) ff[v] = ff[u] - Size[v] * (a[v] + 1) + (Size[1] - Size[v]) * 3;///父节点全体路径减去自己的路径加上从自己这里到父节点的路径
else ff[v] = ~(1LL << 63);
dfs2(v, u);
}
ans = min(ans, ff[u]);
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int u = 1;u <= n;u++) {
string s;
cin >> s;
a[u] = s.size();
int m;
cin >> m;
if (!m) Size[u] = 1;
for (int j = 1;j <= m;j++) {
int v;
cin >> v;
g[u].push_back(v);
g[v].push_back(u);
}
}
dfs1(1, 0);
//for (int i = 1;i <= n;i++) cout << Size[i] << ' ';
//for (int i = 1;i <= n;i++) cout << f[i] << ' ';
ff[1] = f[1];
dfs2(1, 0);
//for (int i = 1;i <= n;i++) cout << ff[i] << ' ';
cout << ans - Size[1] << '\n';///路径把末尾的'\'删除,共Size[i]个
return 0;
}
/*
8
bessie 3 2 6 8
folder1 2 3 4
file1 0
folder2 1 5
file2 0
folder3 1 7
file3 0
file4 0
*/
NC24263 USACO 2018 Feb G]Directory Traversal的更多相关文章
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- USACO翻译:USACO 2012 FEB Silver三题
USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...
- USACO翻译:USACO 2014 FEB SILVER 三题
USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...
- 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348
目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...
- ZOJ 4010 Neighboring Characters(ZOJ Monthly, March 2018 Problem G,字符串匹配)
题目链接 ZOJ Monthly, March 2018 Problem G 题意 给定一个字符串.现在求一个下标范围$[0, n - 1]$的$01$序列$f$.$f[x] = 1$表示存在一种 ...
- 【常见Web应用安全问题】---4、Directory traversal
Web应用程序的安全性问题依其存在的形势划分,种类繁多,这里不准备介绍所有的,只介绍常见的一些. 常见Web应用安全问题安全性问题的列表: 1.跨站脚本攻击(CSS or XSS, Cross Si ...
- [USACO 2018 Jan Gold] Tutorial
Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...
- Web for pentester_writeup之Directory traversal篇
Web for pentester_writeup之Directory traversal篇 Directory traversal(目录遍历) 目录遍历漏洞,这部分有三个例子,直接查看源代码 Exa ...
- USACO 2009 Feb 股票市场 Stock Market
USACO 2009 Feb 股票市场 Stock Market Description 尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气.贝西开挂了,她知道S ...
- NC24724 [USACO 2010 Feb S]Chocolate Eating
NC24724 [USACO 2010 Feb S]Chocolate Eating 题目 题目描述 Bessie has received \(N (1 <= N <= 50,000)\ ...
随机推荐
- 例2.6 设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂度为0(1)。
1.题目 例2.6 设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂度为0(1). 2.算法思想 3.代码 void DeleteX(SeqList LA, Se ...
- 如何查找SpringBoot应用中的请求路径(不使用idea)
背景 昨天有个同事向我咨询某个接口的物理表是哪个,由于公司业务较多.这块业务的确不是我负责的,也没有使用idea不能全局搜索(eclipse搜不到jar内的字符串),也就回复了不清楚. 除了自己写代码 ...
- Oracle12c新增max_idle_time参数的学习与感触
Oracle12c新增max_idle_time参数的学习与感触 TLDR 其实任何软件出了新版本.readme 是很重要的. 尤其是数据库, 涉及到底层问题的. 比如这次遇到的Oracle的max_ ...
- [转帖]TIDB - 使用 Dumpling 和 TiDB Lightning 迁移Mysql数据至TIDB中
一.TiDB Lightning介绍 TiDB Lightning 是一个将全量数据高速导入到 TiDB 集群的工具,目前支持 Mydumper 或 CSV 输出格式的数据源.你可以在以下两种场景下使 ...
- [转帖]Chrome 109发布,最后一个支持Windows 7/8的版本
https://www.163.com/dy/article/HQR3QQFD0511CUMI.html 出品 | OSC开源社区(ID:oschina2013) Google 在去年 12 月 1 ...
- [转帖]docker 最新版本升级
文章目录 前言 一.卸载低版本docker 1.1 检查docker版本 1.2 删除docker 二.开始安装 2.1 安装所需依赖 2.2 设置docker yum源 2.3 查看所有可用版本 2 ...
- kubeadm 搭建 k8s 1.21 三主两从的简单学习
kubeadm 搭建高可用k8s1.21集群的方法 本文学习自: https://www.cnblogs.com/wjhlinux/p/14422021.html 第0部分: 整理的部分脚本 导出所有 ...
- Android APP升级时解析程序包时出现问题
一个新的测试机在自动下载升级安装更新版本APP时,报出"解析程序包时出现问题"错误.原因众说纷纭, 一番搜索,下面的回答比较全面: https://stackoverflow.co ...
- ABP系列文章收藏
1.ASP.NET样板开发框架ABP系列之ABP入门教程详解: https://www.php.cn/csharp-article-380181.html 2.官网中文翻译: https://www ...
- Registration Authority 简介
RA 功能简介 在公共密钥基础设施(PKI)中,CA(Certificate Authority,证书颁发机构)系统的RA(Registration Authority,注册机构)是PKI体系结构的重 ...