步行(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分。

最新文章

  1. HDU 5025 (BFS+记忆化状压搜索)
  2. Mac OS X Server 安装与应用
  3. Delphi TcxTreeList 怎么设置分组
  4. Qt 学习之路:QML 组件
  5. Android 4.4(KitKat)中VSync信号的虚拟化
  6. delete 多表删除的使用(连表删除)
  7. uva 12171 hdu 1771 Sculpture
  8. 学习MVC之租房网站(三)-编写实体类并创建数据库
  9. 关于flask线程安全的简单研究
  10. Java(15) 多态
  11. python shell与反弹shell
  12. python--jianja2
  13. java StringBuilder和StringBuffer 用法
  14. Ansible修改自定义端口和登录用户
  15. JS----获取DOM元素的方法(8种)
  16. spark-机器学习实践-K近邻应用实践一
  17. ios中VRGCalendarView日历控件
  18. 【XSY2307】树的难题
  19. 开始Admob广告盈利模式详细教程
  20. Swift 开发语法

热门文章

  1. PyTorch安装及试用 基于Anaconda3
  2. 剑指offer(一)——二维数组中的查找
  3. Python3正则表达式学习笔记
  4. 20210821 打表,蛇,购物,ants
  5. MFGTool2 的使用
  6. Selenium系列(八) - 截取完整页面和截取指定元素并保存为图片
  7. vue 路由视图,router-view嵌套跳转
  8. 【曹工杂谈】Maven底层容器Plexus Container的前世今生,一代芳华终落幕
  9. SVN无法查看最近日志和提交记录
  10. GIT:创建、查看分支命令(git branch -vv)