步行(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 有一群好朋友,他们 ...
随机推荐
- VPS系统后台性能优化实战
作者: 刘用, 现任新东方APP团队高级软件工程师 2019年开始,新东方APP团队启动了长达半年以上的稳定性建设工作,为什么稳定性如此重要?因为随着每年30%以上的高速增长,现有的后端服务完全扛不住 ...
- MySQL 实例空间使用率过高的原因和解决方法
用户在使用 MySQL 实例时,会遇到空间使用告警甚至超过实例限额被锁定的情况.在 RDS 控制台的实例基本信息中,即会出现如下信息: 本文将介绍造成空间使用率过高的常见原因及其相应的解决方法.对于M ...
- Linux centos7 pstree
2021-08-12 1.命令简介pstree (display a tree of processes) 命令用于查看进程树之间的关系,即哪个进程是父进程,哪个是子进程,可以直观地看出是谁创建了谁. ...
- GoLang设计模式02 - 工厂模式
工厂模式是一种创建型模式,也是最常用的设计模式之一.调用方通过工厂产出并获取对象,可以不必关注对象创建的细节和构建逻辑. 在工厂模式下,调用方只和工厂进行交互,并告诉工厂具体获取哪种类型的对象.工厂负 ...
- 从零开始学习SQL SERVER(1)--- 了解SQL
SQL是什么 SQL (发音为 sequal [' sikwəl ' ]) SQL指 Structured Query Language 结构化查询语言,是用于访问和处理数据库的标准的计算机语言. ...
- Java学习笔记--面对对象OOP
面向对象编程 OOP 面向对象&面向过程 面向对象编程的本质:以类的方式组织代码,以对象的方法组织数据 面向对象编程的三大特征: 封装 继承 多态 方法 静态方法 通过 static 关键词说 ...
- type switch使用
type switchs用法 这里存在一个未知类型变量的内省操作(introspection operation),就是x.(type),其中x是interface{}类型
- [CSP-J2020] 优秀的拆分
[CSP-J2020] 优秀的拆分 难度:普及- 题目描述 一般来说,一个正整数可以拆分成若干个正整数的和. 例如,1=1,10=1+2+3+4 等.对于正整数 n 的一种特定拆分,我们称它为&quo ...
- vue项目实现文件下载进度条
平时业务中下载文件方式常见的有俩种: 第一种,直接访问服务器的文件地址,自动下载文件: 第二种 ,服务器返回blob文件流,再对文件流进行处理和下载. 一般小文件适用于第一种下载方案,不占用过多服务器 ...
- 注意!PHP中字符串与数字的比较
在日常开发过程中,运算符是我们每天都会接触到的.这个运算符中其实埋了非常多的坑,今天我们就来看下字符串和数字用比较需要注意的问题. 首先来看看这些代码: echo '"1234" ...