校内模拟赛 路径 题解

news/2025/9/30 14:43:09/文章来源:https://www.cnblogs.com/needna/p/19121082

题意:

有一棵 n 个节点的无根树(\(n\le 1.6\times 10^5\)),树上第 i 个节点有一个正整数 \(A_i\) 作为点权。有趣的是,这棵无根树度数为 1 的节点不超过 10 个。

请求出一条树上的路径,使得路径上包含的节点个数乘以路径经过点权的最大公约数最大。

题解:

方法一:

乱搞,由于一个数的因数是 \(\sqrt n\) 左右的,所以我们可以把每一个叶子拎出来,用 map 维护对于这个子树,经过自己且自己为一个链的端点的所有可能的答案。我们不可能数漏,因为把每一个叶子拎起来的过程就对应了一种成链方向,而枚举所有叶子可以保证每一条可能的答案都至少形成一次祖先子树关系。复杂度 \(O(10n\sqrt n)\) 左右,跑不满。

code:

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define umap unordered_map
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=2e5+10;
int n,m,k,T,a[N],d[N],ans;
umap<int,int> mp[N];
vector<int> g[N];
void dfs(int u,int fa){for(int v:g[u]){if(v==fa) continue;dfs(v,u);for(auto t:mp[v]){int x=__gcd(a[u],t.fi);mp[u][x]=max(mp[u][x],t.se+1);ans=max(ans,x*t.se+1);}mp[v].clear();}mp[u][a[u]]=max(mp[u][a[u]],1ll);ans=max(ans,a[u]*mp[u][a[u]]);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;rep(i,1,n){cin>>a[i];	}rep(i,1,n-1){int u,v;cin>>u>>v;d[u]++;d[v]++;g[u].pb(v);g[v].pb(u);}rep(i,1,n){if(d[i]==1){dfs(i,0);ans=max(ans,a[i]*mp[i][a[i]]);mp[i].clear();}}cout<<ans;return 0;
}

方法二:

思考链的情况,其实就是JSOI2015] 最大公约数 - 洛谷,复杂度 \(O(n\log^2n)\) 我们考虑延续这种做法,发现我们可以把任意两个叶子的路径组成一条链,答案一定在这之中,总复杂度\(O(45n\log^2 n)\)

细节:用 dfs 序 \(+\) 栈 维护这条路径上的点比较方便。不要乱用 \(long~long\)\(T\)

code:

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=2e5+10;
int n,m,k,T,a[N],f[N],tmp[N],cnt,dfn[N],idx[N],top[N];
int hson[N],siz[N],dep[N],d[N],s[N],tot;
long long ans;
vector<int> g[N];
void dfs1(int u,int fa){f[u]=fa;dep[u]=dep[fa]+1;siz[u]=1;for(int v:g[u]){if(v==fa) continue;dfs1(v,u);siz[u]+=v;if(siz[v]>siz[hson[u]]) hson[u]=v;}
}
void dfs2(int u,int fa){dfn[u]=++tot;idx[tot]=u;if(hson[u]){top[hson[u]]=top[u];dfs2(hson[u],u);}for(int v:g[u]){if(v==fa||v==hson[u]) continue;top[v]=v;dfs2(v,u);}
}
void work(int s,int e){if(s==e){ans=max(ans,(ll)a[idx[tmp[s]]]);return;}int mid=s+e>>1;work(s,mid);work(mid+1,e);int g=a[idx[tmp[mid]]],l=mid,r=mid;while(s<l&&r<=e){g=__gcd(g,a[idx[tmp[--l]]]);while(s<l&&!(a[idx[tmp[l-1]]]%g)) l--;while(r<e&&!(a[idx[tmp[r+1]]]%g)) r++;ans=max(ans,(ll)(r-l+1)*g);}g=a[idx[tmp[mid]]],l=r=mid;while(s<=l&&r<e){g=__gcd(g,a[idx[tmp[++r]]]);while(s<l&&!(a[idx[tmp[l-1]]]%g)) l--;while(r<e&&!(a[idx[tmp[r+1]]]%g)) r++;ans=max(ans,(ll)(r-l+1)*g);}
}
void mak(int x,int y){stack<pii>st1,st2;cnt=0;int tag=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y),tag^=1;if(tag==0) st1.push({dfn[top[x]],dfn[x]});else st2.push({dfn[top[x]],dfn[x]});x=f[top[x]];}if(dep[x]>dep[y]) swap(x,y);st1.push({dfn[x],dfn[y]});while(!st1.empty()){pii l=st1.top();st1.pop();per(i,l.se,l.fi) tmp[++cnt]=i;}while(!st2.empty()){pii l=st2.top();st2.pop();rep(i,l.fi,l.se) tmp[++cnt]=i;}work(1,cnt);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;rep(i,1,n) cin>>a[i];rep(i,1,n-1){int u,v;cin>>u>>v;d[u]++;d[v]++;g[u].pb(v);g[v].pb(u);}dfs1(1,0);top[1]=1;dfs2(1,0);tot=0;rep(i,1,n) if(d[i]==1) s[++tot]=i;rep(i,1,tot)rep(j,i+1,tot)mak(s[i],s[j]);cout<<ans;return 0;
}

方法三(官方写法):

注意到只有 \(10\)个叶子节点,所以我们依此从这 \(10\)个叶子节点开始 DFS。 并且可以发现对于一个串从左往右做前缀gcd,最多只有 \(O(logV)\)个不同的值。 所以我们维护分界点的位置和值,然后对于在串的开头增加一个数字,我们可以\(O(logV)\) 暴力更新我 们维护的位置和值。 所以每次DFS的时候,从上往下DFS,并且维护每个点到根节点的路径上的\(O(logV)\) 个分界点即可。 最终复杂度\(O(10nlogV)\)

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<vector>
#define pb push_back
#define mp make_pair
#define xx first
#define yy second
#define rep(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;i++)
#define dwn(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;i--)
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;
}
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=160010;
int n,fa[maxn],val[maxn],first[maxn],nxt[maxn<<1],to[maxn<<1],deg[maxn],e;
void AddEdge(int u,int v) {to[++e]=v;nxt[e]=first[u];first[u]=e;to[++e]=u;nxt[e]=first[v];first[v]=e;deg[u]++;deg[v]++;
}
ll ans;
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
ll dep[maxn];
struct Data {int n;pii a[35];
}D[maxn];
void dfs(int x) {D[x]=D[fa[x]];dep[x]=dep[fa[x]]+1;D[x].a[++D[x].n]=mp(x,val[x]);rep(i,1,D[x].n) {D[x].a[i]=mp(D[x].a[i].xx,gcd(D[x].a[i].yy,val[x]));ans=max(ans,D[x].a[i].yy*(dep[x]-dep[fa[D[x].a[i].xx]]));}int cnt=0;rep(i,1,D[x].n) if(D[x].a[i].yy!=D[x].a[i-1].yy) D[x].a[++cnt]=D[x].a[i];D[x].n=cnt;for(int i=first[x];i;i=nxt[i]) if(to[i]!=fa[x]) fa[to[i]]=x,dfs(to[i]);
}
int main() {n=read();rep(i,1,n) val[i]=read();rep(i,2,n) AddEdge(read(),read());rep(i,1,n) if(deg[i]==1) fa[i]=0,dfs(i);printf("%lld\n",ans);return 0;
}

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

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

相关文章

Vue2 和 Vue3 中 watch 用法和原理详解 - 实践

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

05-FreeRTOS的内存管理

概述 在 FreeRTOS 中,内存管理是连接内核功能与硬件资源的核心环节,直接影响系统的实时性、稳定性和资源利用率。对于基于 STM32 的开发,理解 FreeRTOS 的 内存管理方案是实现可靠嵌入式系统的基础。 一、为什么要学…

做网站先做首页wordpress的首页文件夹

在当今快速发展的工业领域&#xff0c;大数据已成为推动企业转型升级的核心动力。工业大数据&#xff0c;以其独特的价值和潜力&#xff0c;正逐渐改变着传统的生产、管理和决策模式。然而&#xff0c;伴随着大数据的快速发展&#xff0c;一系列挑战也随之浮现。本文将深入探讨…

2025攻丝机品牌最新权威推荐排行榜:聚焦全自动攻丝机,半自动等机型,精选攻丝机实力厂商助企业高效选购

当前工业自动化进程持续加快,攻丝机作为机械加工核心设备,其质量与性能直接关系企业生产效率、产品精度及成本控制。但市场上攻丝机品牌繁杂,产品质量参差不齐,部分设备存在精度不足、故障率高、适配性差等问题,加…

​​AI重构混沌工程:智能韧性守护架构高可用时代已来​

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

064_尚硅谷_短路与和短路或

064_尚硅谷_短路与和短路或1.逻辑运算符的注意事项和细节说明,`短路与`和`短路或` 2.案例:短路与,解释:第一个条件为true则整体为true 3.案例:短路或,解释:符号左侧如果为true符号右侧则不执行,符号左侧为fals…

oppoR9m刷Linux系统: 说明-注意事项-知识点

前言全局说明整体介绍说明一、说明 1.1 环境: Windows 7 旗舰版二、想法 几年前,就发现家里闲置手机在角落吃灰。 因为系统是android 使用场景被限制很多。 所以就想,能不能做个家里的网络设备、软路由、网络存储什么…

手机框架材质

1、铝合金 6063 铝合金:硬度较低,质地柔软,易于加工成型,适合复杂形状的加工,如 iPhone 6 的后壳制作。但其强度相对较弱,容易出现变形等问题,这也是 iPhone 6 “折弯门” 的原因之一。耐腐蚀性较好,因为其主要…

2025年陶瓷定制企业最新推荐榜单:涵盖电子陶瓷,氧化铝陶瓷,氧化锆陶瓷,氮化铝陶瓷,结构陶瓷领域!

当前,高端制造产业持续升级,特种陶瓷因具备优异物理化学性能,已成为电子、新能源、航空航天等关键领域的核心材料。但陶瓷定制行业乱象凸显,多数企业存在全产业链整合能力薄弱、技术储备不足、售后服务缺失等问题,…

wordpress 付费支持上海网站优化公司

IO隔离&#xff1a;方便程序修改 无论是输入点坏了还是输出点坏了&#xff0c;或者人为接错线&#xff0c;或者对调点&#xff0c;我们只需要更改IO隔离得输入输出就可以了。方便。 停止按钮外接常闭&#xff0c;里面也使用常闭&#xff0c;为了断线检测功能(安全)&#xff…

上海工程建设造价信息网站知识营销

目录 1.1 简介1.2 创建任务1.3 使用任务执行基本的操作1.4 组合任务1.5 将APM模式转换为任务1.6 将EAP模式转换为任务1.7 实现取消选项1.8 处理任务中的异常1.9 并行运行任务1.10 使用TaskScheduler配置任务执行参考书籍笔者水平有限&#xff0c;如果错误欢迎各位批评指正&…

网站定位的核心意义下载wordpress低版本

后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 本系统在设计过程中&#xff0c;很好地发挥了该开发方式的优…

网站域名跳转代码潍坊网站制作保定公司电话

当下&#xff0c;社会生活的节奏非常快&#xff0c;人们忙于工作&#xff0c;在日常生活家务清洁中面临着时间、精力不足的问题&#xff0c;因此对家政服务的需求日益增加&#xff0c;这也推动了家政行业的迅速发展。目前不少年轻人都开始涌入到了家政行业中&#xff0c;市场的…

2025阳台装修品牌推荐榜:优质阳台厂商资质、技术、服务测评及高口碑企业优选指南,浙江多为建筑服务与性价比兼具!

阳台已从单一的功能区升级为家居生活的 “第三空间”,承载着休闲、收纳、观景等多重需求,但行业乱象仍让消费者决策困难。部分企业缺乏资质导致施工粗糙,漏水、材质霉变等问题频发;服务断层现象普遍,测量、设计到…

2025 年杭州小程序开发机构最新推荐榜单:覆盖多行业定制需求,助力企业精准选靠谱服务商

在数字化转型加速推进的 2025 年,小程序已成为企业连接用户、拓展业务的关键载体,然而杭州小程序开发市场却鱼龙混杂,让企业选型陷入困境。不少企业因选错服务商,遭遇系统拓展性差、项目延期、功能与需求脱节等问题…

2025年杭州软件开发公司最新品牌推荐榜:聚焦技术实力与售后体系的优质服务商精选指南!

在数字经济高速发展的当下,杭州软件开发市场规模持续扩大,各类服务商数量激增,企业在选择合作方时常常陷入困境。部分服务商技术储备不足,难以应对复杂项目开发需求;沟通效率低下,导致需求理解偏差,项目交付质量…

python可以做网站前台么民房做酒店出租网站app

离开北京的时候是周五&#xff0c;天气很诡异&#xff1a;潮湿而又充满尘燥&#xff0c;阴霾而又阳光明亮&#xff0c; 真不知道这样的天气怎么能够共存&#xff1f;&#xff01; 我发神经的做上了飞往云南的航班&#xff0c;这是休息&#xff0c;是治疗。 飞机正位&#xff0c…

湖南省茶陵一中校庆120周年:205班捐款

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087各位同学: 大家好! 在母校茶陵一中百廿年校庆之际,我们205班为母…

实用指南:计算机网络-ipv4首部校验原理

实用指南:计算机网络-ipv4首部校验原理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

网站建设ppt答辩wordpress 自动采集插件

矩阵的特征分解 特征值和特征向量的定义 抄来的&#xff1a;奇异值分解 困惑1&#xff1a;特征值和特征向量&#xff0c;和原矩阵是怎样的关系&#xff0c;需要一个栗子进行更具象的认识 困惑2&#xff1a;为什么多个特征向量组合成的矩阵&#xff0c;可以构成矩阵A的特征分解…