SS241007C. 步行(walk)

news/2024/12/21 19:58:55/文章来源:https://www.cnblogs.com/liyixin0514/p/18450691

SS241007C. 步行(walk)

题意

给你一个 \(n \le 3 \times 10^5\) 个结点的树,每个结点有一个权值 \(a_i\)。有 \(m \le 1.5 \times 10^6\) 次询问,每次删除一条边,然后再连上一条边。如果修改后的图不是树输出无解。否则找出一条路径,满足每个点恰好经过 \(a_i\) 次,问路径权值最大是多少。路径权值指路径路程长度加上终点到起点的距离,即回路的路程长度。\(s=\sum a_i \le 10^{12}\)。询问独立。

思路

首先你不知道走这些点的顺序,因此考虑贪心,然后你就发现贪心假上加假,很难做。

考虑先算原图的答案,每次询问快速更新答案。

然后考虑拆开每条边的贡献,设 \(sz_u\) 表示 \(u\) 的子树的权值之和。一条边 \(e_i\) 的贡献上界是 \(2\min(sz_u,s-sz_u)\)。可以自行画图理解。如图 1。

然后结论是存在一种方案使得每条边都达到贡献上界。

一个经典的结论是,每条边被经过次数的上限为两侧权值和较小的值,而取带权重心后,在多个子树之间来回跳跃即可构造目标路径,也就是说我们完全能取到上界。

题解是这么证明的。然后讲我的理解。

选定一条边 \(e\),上端点是 \(u\),下端点是 \(v\),来回走它,上去又下来,下来又上去。这条边把图分成上下两部分。如图 2。假设上部的权值和较小,【走到上部,再走下去】这种操作的次数就恰好是权值和次。对于与 \(u\) 相连的边 \(e'\),上部一定比下部小,因此给 \(e'\) 分上部权值次数的操作机会,就恰好能构造 \(e'\) 的贡献的上界。因此上部所有边都可以构造上界。

对于下部,【走到下部,再走上去】这个操作的次数恰好是 \(e\) 的上界次。对于与 \(v\) 相连的边 \(e'\)\(e'\) 的上界可能大于 \(e\) 也可能小于 \(e\) 的上界。假设是大于,那么把操作全部分给 \(e'\),然后取其中一次操作,走到下部后,回到 \(v\),然后再走到下部某个儿子,再回到 \(v\),重复若干次,最后上到上部。如图 3。反正操作够就分给 \(e'\),分完不够就取一个操作多刷几次,每次刷可以给一个 \(e'\) 带来 \(2\) 的次数,因为每条边的上界都是偶数,因此总会有一种刷法。

考虑删边和加边,我们需要维护每个点的 \(sz\)

删除 \((a,b)\),加入 \((c,d)\)

判无解就判一下是否存在边 \((a,b)\) 以及用 dfs 序判一下 \(c,d\) 是否恰好一个在上部一个在下部即可。

  • 对于 \([a,lca)\) 的点 \(u\)\(sz_u-sz_b\)
  • 对于 \([c,lca)\) 的点 \(u\)\(sz_u+sz_b\)
  • 对于 \([b,d]\) 的点 \(u\),设 \(u\) 在链 \([b,d]\) 上的儿子是 \(v\)\(d\) 在链上没有儿子),\(sz_u\gets sz_b-sz_v\)
  • 对于其他点,\(sz\) 不变。

当然我们不能暴力修改所有点。

比较烦人的是一个点(一个点对应它向上连父亲的那条边)的贡献是 \(2\min(sz,s-sz)\)。我们发现一条链上的 \(sz\) 是单调的。把贡献变成 \(2 (sz+ \min(0,s-2sz))\) 比较方便。

因此我们要处理出三条链的 \(\sum sz\),以及找到 \(2sz=s\) 的分界点,然后加上一部分的 \(s-2sz\)。可以倍增处理。

对于要找链上的儿子,相对复杂的第 3 种链,考虑一个转化。令 \(sz_u\gets sz_b-sz_u\),那么 \(sz_d\gets sz_b\),然后我们求 \([d,b)\) 这条链就行了。

时间复杂度是 \(O((n+m) \log n)\)

code

被卡常了 qwq,只有 76pts。

把 map 改成二分可以变成 85pts,慎用 STL。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809950.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day02_基本的DOS命令

电脑常用快捷键 常用快捷键快捷键 作用CTRL + c 复制CTRL + v 粘贴CTRL + x 剪切CTRL + z 撤销CTRL + s 保存alt + f4 关闭窗口del 删除shift + del 强制删除Windows + r 打开 “运行” 窗口windows + e 打开 “我的文档”ctrl + alt + del 锁定/切换用户/注销/更改密码/任务管…

组态也能开发WEB前端 | uiotos致敬amis、nodered、appsmith、codewave、goview、dataroom、iotrouter、FUXA、乐吾乐

WEB组态开发SCADA、HMI画面、大屏可视化,还比较常见。比如下面: UIOTOS组态示例 那么常规WEB前端功能,组态能否一并做了呢?比如下面这种: UIOTOS前端示例 答案是可以的!UIOTOS支持页面无限嵌套,能实现原型即应用。现在就以一个具体小示例介绍如何实现的。 效果 如下所示…

GUI无代码小示例 - 工作流连线实现0/1连续翻转

效果 如下所示,连续点击按钮,输出0、1、0、1...。 步骤新建页面,拖入组件拖入3个组件:数学计算、输入框、按钮。如下所示: 连线和配置按钮点击 → 函数执行1减去输入,作为函数输出这样,当首次执行时,默认操作数1将减去输入的1,输出0。 函数输出→ 输入框 → 函数输入 …

Java生成条形码(亲测可通过扫码枪扫出)

Java生成条形码(亲测可通过扫码枪扫出) 秃秃爱健身该博客介绍了如何在Java项目中通过barcode4j库生成Code128条形码,解决了条形码扫不出或美观度不足的问题。提供了相关代码示例,包括Maven依赖、工具类和生成条形码的方法,可以自定义条形码的高度、宽度、是否留白和隐藏文…

点“亮”户外应用场景,来看触想高亮显示器TPC-M8的硬实力!

工业显示器作为信息可视化和人机交互的重要媒介,正在越来越多领域担当关键任务,工业显示器的可读性及耐用性,影响应用体验、设备安全和生产效率。尤其在户外,面对高低温、灰尘雨水、强光紫外线等极端因素,常规性能的工业显示器已不足以覆盖户外高风险应用需求。为此,触想…

phpvulhunter工具:静态 php 代码审计

phpvulhunter是一款PHP源码自动化审计工具,通过这个工具,可以对一些开源CMS进行自动化的代码审计,并生成漏洞报告。 1、安装 首先从github上进行获取: git clone https://github.com/OneSourceCat/phpvulhunter2、下载完成后,将工程目录放置于 WAMP 等 PHP-Web 运行环境中…

YOLOv8-seg训练与推理

1.YOLOv8-seg简介 YOLOv8-seg是YOLO系列模型的其中一个版本。YOLOv8-seg在继承YOLO系列模型高效性和准确性的基础上,增加了实例分割的能力。 2.数据集使用的数据集较简单,主要以下目录:images:存放原始图片(1500张),大小为128x128。部分如下: images_json:存放labelme标注的…

易基因: cfMeDIP-seq揭示cfDNA甲基化高效区分原发性和转移性前列腺|Nat Commun

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 前列腺癌(Prostate cancer,PCa)是男性中第二常见的恶性肿瘤,也是全球癌症相关死亡的第三大原因。虽然大多数原发性前列腺癌可以治愈,但转移性前列腺癌患者的5年生存率仍低至30%。大多数患者很快就会发展成…

从零搭建Xswitch进行测试

1 xswitch官网 拉取社区版xwitch docker镜像,编译之,修改.env文件 ,把docker跑起来,这个是核心服务 跑起来如下,端口映射不需要管,他内部做好的,默认sip使用7060 前端ws连接端口 8081 wss连接端口 8082 2 自己照着官网ES6 demo 例子写 Vetro 例子,我是用的vue搞的前端…

【日记】医生拆线居然还能没拆干净(1796 字)

正文早上拆线,医院的门诊登记簿上写名字排队。我前面人还挺多。不过医生问过前面的情况之后,就先给我做了,因为拆线快。等我到市里转车,吃过饭后才发现,那个医生拆线没拆干净…… 吃了饭感觉口腔里还是有奇怪的东西,那个粗糙的质感,确定是线头没错了……找了个酒店的卫生…

Docker 学习笔记-基本概念与安装

Docker 学习笔记 基本概念镜像:Docker 的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。 DockerFile;镜像可以基于 DockerFile 构建,DockerFile 是一个描述文件,里面包含若干条命令,每条命令都会对…

面相快速入门教程7木型

7 木型 在本章中,我将介绍木型的基础知识,你将学会如何识别木型。首先,我们来快速参考一下木的特征:能量:向上、推动、活跃、早晨、春天、童年 特质:乐观、热情、活跃、人道主义、自信、愤怒、沮丧、冲动、反应灵敏、直接、敏锐、实际、逻辑性强、有条理、果断、有判断力…