步行(walk.cpp) noip模拟
步行(walk.cpp)
【题目描述】
小C喜欢步行,只有缓慢的步行,小C才能沉浸于其中,享受旅途中那些美好的瞬间。
小C来到了一座新的城市生活,这座城市可以看成 \(n\) 个点, \(n−1\) 条长度为1的无向边连接 的连通图,也就是说这个城市的结构是一棵树。小C计划在这个城市旅行,他对这个城市的 每一个节点都进行了初步的了解,并制定了一个旅行计划,他按照自己的兴趣等因素,为每 一个节点设定了游览次数 \(v_i\) ,表示他计划在第 \(i\) 个节点游览多少次。
在这之后,小C想要找出一个游览序列。游览序列是一个长度为\( = \sum v_i\) 的序列,对于 \(i \in [1,n]\) , \(i\) 在序列中出现vi次,设这个序列为 $ A$ 。确定序列后小C将会沿着 $ A_1,A_2,...,A_S$ 的顺序 步行游览,每次从一个点走最短路径到下一个点,并最终从AS返回 \(A_1\) ,游览序列中相邻的 两位以及,1可以相同,这个时候小C的步行距离为0。小C喜欢步行,因此他希望他的总步 行距离尽可能长。
小C发现这一座城市还会时常发生交通管制事件,在这样的情况下,一条原有的道路会无法通行,还会有一条临时道路出现,管制过程中这座城市依旧连通。小C会告诉你m次这 样的事件,希望你告诉他在这m种管制情况下,他的最长步行距离分别是多少。然而小C的信息也有可能是错的,例如无法通行的道路不存在,或者管制后的城市不连通,这时你需要告诉他这条信息是错误的。
题目大意:
一棵树,求一个每个点出现特定次数的序列,使得这个序列相邻的两位之间, 包括最后一位与第一位之间的距离之和最大。每次去掉一条边加上一条边询问。
3.1 算法 1
暴力枚举游览序列,查询树上距离。
时间复杂度 \(O(S!nm)\)。
期望得分8分。3.2 算法 2
考虑树形 dp,令 \(f_{i,j}\) 表示i号点的子树里面的所有点在序列中构成j个连续段,子树内步行距离和最大值。转移时枚举两个子树,以及有多少段合并起来了。
时间复杂度 \(O(mS_3)\) 。
期望得分16分。
3.3 算法 3
观察到每条边走的次数是把这条边断掉之后,出现次数和较小的连通块的出现次数和的两倍。
答案显然不可能超过这个值,构造也比较容易,找到树的带权重心,权为每个点出现次数,这样所有边断掉之后较大的连通块都包含重心。接下来就是把重心去掉,每个部分的出现次数之和都不超过 \(S2\) ,容易构造出一种序列使得相邻两位都不来自相同的连通块, 这样就达到了这个最大值。
既然有了这个结论,每次 dfs 算出子树和就可以得到答案了。
时间复杂度 \(O(nm)\)
期望得分36−44分。
3.4 算法 4
可以发现,如果按照每条边来算贡献的话,那么在添加的道路两个端点对应原树的路径上的边贡献会改变,其他的均不会改变。因为树是完全二叉树,两点之间边数只有\(O(log(n))\) 级别,暴力计算即可。
时间复杂度 \(O(n+mlog(n))\) ,结合前面的算法。
期望得分44−52分。
3.4 算法 5
如果树是一条链,那么修改一条边之后也只会是一个“T”状图。在这个“T”状图上
二分重心的位置,然后计算对应部分的贡献。
时间复杂度\(O(n+mlog(n))\)。
结合前面的算法,期望得分52−64分。
3.6 算法 6
首先当n较大的时候,信息错误使用倍增 lca 代替暴力判断即可 。
信息正确时,只需要延续算法 5 的思路,不妨把新添加的边端点在原树上的对应链提出来,加上新添加的边构成一个环。整棵树就变成了环套树。把环以外的所有边的贡献先算出来,这个可以通过子树和的方式计算。然后把环外面每个点的出现次数都加到对应的环上的点上面。这样问题就变成了一个环断掉一条边,答案是多少。采用算法 5 的二分方法,不过在这里是使用倍增数组进行二分。实现良好的话可以通过。
时间复杂度\(O((n+m)log(n))\)。
期望得分68−100分。
步行(walk.cpp) noip模拟的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- 2016-06-19 NOIP模拟赛
2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- 2019.6.20 校内测试 NOIP模拟 Day 1 分析+题解
这次是zay神仙给我们出的NOIP模拟题,不得不说好难啊QwQ,又倒数了~ T1 大美江湖 这个题是一个简单的模拟题. ----zay 唯一的坑点就是打怪的时候计算向上取整时,如果用ceil函数一 ...
- NOIP模拟17.9.21
NOIP模拟17.9.21 3 58 145 201 161.5 样例输出21.6 数据规模及约定对于40% 的数据,N <= 20对于60% 的数据,N <= 1000对于100% 的数 ...
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
- NOIP模拟赛 6.29
2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...
- NOIP模拟 6.28
NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这 ...
- NOIP模拟 17.8.15
NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...
随机推荐
- 并发编程之:Atomic
大家好,我是小黑,一个在互联网苟且偷生的农民工. 在开始讲今天的内容之前,先问一个问题,使用int类型做加减操作是不是线程安全的呢?比如 i++ ,++i,i=i+1这样的操作在并发情况下是否会有问题 ...
- vscode Markdown Preview Enhanced 安装配置
打开VSCode 打开Externsion,可通过Ctrl+Shift+X 选中 Markdown Preview Enhanced并install即可 配置Preview风格: Magage -&g ...
- Shell中的运算
1.运算方式及运算符号 2.SHELL 中常用的运算命令 3.相关操作演示 1.用脚本写一个10秒倒计时 脚本的执行: 2.编写脚本,1分10秒的倒计时 执行脚本: 3.编写脚本,制作一个计算器 脚本 ...
- 【Spring 5.x】学习笔记汇总
Spring 工厂 工厂设计模式.第一个Spring程序细节分析.整合日志框架 注入详解 - Set注入(JDK内置类型,用户自定义类型).构造注入(重载) 反转控制与依赖注入.Spring工厂创建复 ...
- 关于electron-vue打包后静态视频文件无法正常加载的问题解决方法
最近在使用electron-builder构建vue项目的时候发现在生产模式下视频可以正常加载并显示,但是一旦打包到开发环境下,视频就读取不出来了,控制台也并没有报错 一开始博主以为是路径问题,在将路 ...
- Appium自动化(6) - 控件定位工具之uiautomatorviewer 的详细介绍
如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 app定位不如web定位那么 ...
- openswan一条隧道多保护子网配置
Author : Email : vip_13031075266@163.com Date : 2021.01.22 Copyright : 未经同意不得 ...
- openswan协商流程之(二):main_inI1_outR1()
主模式第二包:main_inI1_outR1() 文章目录 主模式第二包:main_inI1_outR1() 1. 序言 2. `main_inI1_outR1()`处理流程图 3. `main_in ...
- c# 递归树形菜单
首先创建模型类Menus public class Menus { //菜单Id public int Id { get; set; } //菜单名 public string MenuName { ...
- 处理器核、Core、处理器、CPU区别&&指令集架构与微架构的区别&&32位与64位指令集架构说明
1.处理器核.Core.处理器.CPU的区别 严格来说"处理器核"和" Core "是指处理器内部最核心的部分,是真正的处理器内核:而"处理器&quo ...