CF1916G Optimizations From Chelsu

news/2025/10/3 21:56:51/文章来源:https://www.cnblogs.com/cjoierzdc/p/19125069

点分治,假设路径的端点是 \(s\)\(t\),那么 \(len\times g\) 就是 \((d_s+d_t)\times \gcd(v_s,v_t)\),其中 \(d\) 是到根链长度,\(v\) 是到根的 \(\gcd\)

不妨设 \(d_s\ge d_t\),那么 \((d_s+d_t)\times \gcd(v_s,v_t)\) 可能贡献到答案需要 \(>d_s\times v_s\),于是有 \(v_s\mid v_t\)

\(v_t=kv_s\)。上面的权值 \((d_s+d_t)\times v_s\) 还需要 \(>d_t\times v_t=kd_t\times v_s\),即 \(d_s>(k-1)d_t\)。那么有 \(k<\frac{d_s}{d_t}+1\le d_s+1\)

我们先统计所有端点为根的答案。然后对于每个 \(v_s\),找出其对应的最深的 \(s\)。如果 \(2d_s\times v_s\) 不超过当前答案就跳过。否则暴力枚举 \(k\) 统计答案。事实上我们可以说明,该做法复杂度为 \(O(n\log^2 n)\)


证明来自 洛谷题解。

考虑一次分治,设当前子树大小为 \(m\)

我们定义 \(u\) 为关键点当且仅当存在 \(k\),满足子树的深度(即子树内与 \(u\) 的最大距离)\(\ge 2^k\),且 \(u\) 的深度 \(=2^k\)

对于每个点 \(x\),找到其祖先中最深的关键点 \(u\),并将 \(x\) 放入 \(S(u,2^k,v_u)\)

首先根据定义,对于相同的 \(k\)\(S(u,2^k,g)\) 只有 \(O(\frac{m}{2^k})\) 个不为空。

对于每个不为空的集合,其中所有点 \(p\) 的深度都是 \(\le 2^{k+2}\) 的。因为我们去掉了不优于到根链的情况,所以此时 \(v_p>\frac{g}{4}\)。同时 \(v_p\) 需要是 \(v_u=g\) 的因数,所以合法的 \(v_p\) 只有 \(O(1)\) 个。我们只会对这 \(O(1)\) 个跑上面的暴力。

那么对于每个 \(k\),我们只会对 \(O(\frac{m}{2^k})\) 个点跑暴力,每次复杂度是 \(O(2^k)\) 的,因此单次复杂度 \(O(m)\)\(\log\) 层复杂度 \(O(m\log m)\)。同时点分治还会有一个 \(\log\),因此总复杂度 \(O(n\log^2 n)\)

代码里用了 map,复杂度多了一个 \(\log\)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;const int kN = 1e5 + 5;
int n;
ll ans;
vector<pair<int, ll>> g[kN];int siz[kN];
bool vis[kN];void DFS(int x, int fa) {siz[x] = 1;for(auto k : g[x]) {int to = k.first;if((to != fa) && !vis[to]) {DFS(to, x);siz[x] += siz[to];}}
}
int Root(int x, int fa, int all) {int mx = all - siz[x];for(auto k : g[x]) {int to = k.first;if((to != fa) && !vis[to]) {mx = max(mx, siz[to]);if(int tmp = Root(to, x, all)) {return tmp;}}}return (mx * 2 <= all) * x;
}struct Node {int mx, se, fr;Node() { mx = se = fr = 0; }Node(int _mx, int _se, int _fr) {mx = _mx;se = _se;fr = _fr;}
};
map<ll, Node> mp;void DFS2(int x, int fa, ll v, int d, int fr) {auto it = mp.lower_bound(v);if((it != mp.end()) && (it -> first == v)) {Node &info = it -> second;if(info.mx < d) {if(info.fr != fr) info.se = info.mx;info.mx = d;info.fr = fr;}else if(info.fr != fr) {info.se = max(info.se, d);}}else {mp.emplace_hint(it, v, Node(d, 0, fr));}for(auto k : g[x]) {int to; ll w;tie(to, w) = k;if((to != fa) && !vis[to]) DFS2(to, x, __gcd(v, w), d + 1, fr);}
}void Divide(int x) {DFS(x, 0);mp.clear();for(auto k : g[x]) {int to; ll w;tie(to, w) = k;if(!vis[to]) DFS2(to, x, w, 1, to);}for(auto k : mp) {ans = max(ans, k.first * k.second.mx);}for(auto k : mp) {ll val;Node info;tie(val, info) = k;if(2 * val * info.mx <= ans) continue;for(int i = 1; i <= info.mx; i++) {ll t = val * i;auto it = mp.find(t);if(it != mp.end()) {Node get = it -> second;if(get.fr != info.fr) {ans = max(ans, val * (info.mx + get.mx));}else {ans = max(ans, val * (info.mx + get.se));}}}}vis[x] = 1;for(auto k : g[x]) {int to = k.first;if(!vis[to]) Divide(Root(to, x, siz[to]));}
}void Solve() {cin >> n;fill_n(g, n + 3, vector<pair<int, ll>> {});fill_n(vis, n + 3, 0);for(int i = 1; i < n; i++) {int u, v; ll w;cin >> u >> v >> w;g[u].emplace_back(v, w);g[v].emplace_back(u, w);}ans = 0;DFS(1, 0), Divide(Root(1, 0, n));cout << ans << "\n";
}int main() {
//  freopen("1.in", "r", stdin);
//  freopen("1.out", "w", stdout);ios::sync_with_stdio(0), cin.tie(0);int t;cin >> t;while(t--) Solve();return 0;
}

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

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

相关文章

详细介绍:微服务架构:基于Spring Cloud ,构建同城生活服务平台

详细介绍:微服务架构:基于Spring Cloud ,构建同城生活服务平台pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

【游记】北京师范大学讲课

【游记】北京师范大学讲课好久没有写长文了,今天很有兴致,写一篇罢! ccpc 网络赛前一天 去北京参加 tower research 举办的宣讲会。结束后和 yzf 找芈重山吃,海淀桥店人满为患,于是跑到了五道口,发现也是人满为患…

做网站 带宽 多少钱厦门国外网站建设公司哪家好

一、按键无效现象1.操作人员对机床操作时画面无反应现象M80/M800系列系统在使用键盘或触摸屏输入时&#xff0c;请勿连击键盘按键&#xff0c;输入一 次即可。键盘每向NC输入一次&#xff0c;NC系统需要计算一次&#xff0c;连续的多次重复输入&#xff0c;NC多次重复计算、显示…

网站建设步骤与时间表个人定做衣服店

提示:本文是我cuda教程部分代码和内容构成,严禁侵权! 文章目录 前言一、核函数index寻找1、3d grid与1d block索引2、1d grid, 2d block索引二、kernel函数实例三、性能优化(内存)四、原子操作五、流stream六、cuda处理nms编码七、cuda处理yolo算法输出编码八、cuda处理yolo…

房产交易网站开发三网合一网站源码下载

本系列第三篇文章&#xff0c;一起了解下PSR规范中的PSR4和PSR0规范首先恭喜大家&#xff0c;包括我自己&#xff0c;坚持到了现在。这篇文章之后&#xff0c;Composer的基础原理就清晰明了咯。也就是说&#xff0c;Composer所利用的正是spl_autoload_register()和PSR4规范&…

青浦网站制作su35湘潭做网站 i磐石网络

9.1 类(class)面向对象最重要的概念就是类(Class)和实例(Instance)&#xff0c;类是抽象的模板以Student类为例&#xff0c;在Python中&#xff0c;定义类是通过class关键字class后面紧接着是类名&#xff0c;即Student&#xff0c;类名通常是大写开头的单词&#xff0c;紧接着…

ARM芯片架构之DAP:AXI-AP 技术详解 - 实践

ARM芯片架构之DAP:AXI-AP 技术详解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

备案中的网站名称重庆百度搜索排名优化

Python实战&#xff1a;打造自定义随机验证码生成器 在许多网站中&#xff0c;验证码作为一种安全机制被广泛采用&#xff0c;用于验证用户身份、防止自动化攻击和确保数据安全。本篇教程将带领您一步步使用Python创建一个功能齐全的随机验证码生成器。我们将通过导入必要的库…

详细介绍:代码世界的“数字刑侦”:深入解析代码审计实战

详细介绍:代码世界的“数字刑侦”:深入解析代码审计实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

三霍尔BLDC如何测量Hall同步角度(需要示波器)

现在电机转子位置估计的研究有两种主流技术路线——一种是无传感器,另一种就是采用低分辨率传感器估计高精度位置。当时我(知乎:土豆泥)本科毕业答辩做的就是霍尔传感器。其实可以看到,近几年业界越来越多的FOC驱…

完整教程:K8s学习笔记(十) Deployment 副本控制器

完整教程:K8s学习笔记(十) Deployment 副本控制器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

湖南建设信息网站做手机版网站和做app差别

接口测试虽然作为版本的一环&#xff0c;但是也是有一套完整的体系&#xff0c;有接口的功能测试、性能测试、安全测试&#xff1b;同时&#xff0c;由于接口的特性&#xff0c;接口的自动化低成本高收益的&#xff0c;使用一些开源工具或一些轻量级的方法&#xff0c;在测试用…

QBXT2025S刷题 Day2

今天的题目 \(rk38\) T1 这道题想了 \(1h\) 差不多。 这道题其实可以直接转化成选一个点,把覆盖着这个点线段全部删掉,使得左右两边都有线段。 可以维护每个点被多少个区间覆盖,左面有多少个区间,右面有多少个区间…

个人主页网址

https://www.cnblogs.com/gutianle

建设项目环境影响评价公示网站wordpress添加干扰代码

数据可视化是将复杂数据转化为易于理解的图表和图形的过程&#xff0c;帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础&#xff0c;本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏&#xff0c;接下来跟随小编的思路走起来~ 1.数据收集和…

离型剂技术支持东莞网站建设php 移动网站开发

1025. 反转链表 (25) 时间限制300 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue给定一个常数K以及一个单链表L&#xff0c;请编写程序将L中每K个结点反转。例如&#xff1a;给定L为1→2→3→4→5→6&#xff0c;K为3&#xff0c;则输出应该为3→2→1→6…

甘肃省工程建设信息官方网站宣传片拍摄构思

伺服放大器功能提升 伺服放大器MELSERVO-JET系列为进一步优化了独家控制引擎的高性能伺服放大器。 可通过与支持CC-LinK IE TSN的运动控制器的同步通信,进行高 速、高精度的运动控制。 除了旋转型伺服电机以外,还支持线性伺服电机。MR-JET-G-N1支持EtherCAT。 旋转型伺服电机 …

Vue之刷新页面会触发的生命周期函数

刷新页面时不会触发组件的 onUnmount 事件。 因为刷新页面会直接销毁整个页面的 DOM 树和内存中的组件实例,属于“强制清空”,而非组件正常从 DOM 树中卸载的流程。 而 onUnmount 的核心是“组件正常卸载(如路由切换…

深入解析:App Store 上架完整流程解析,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 测试与苹果审核经验

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …