博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Walk 解题报告
阅读量:4565 次
发布时间:2019-06-08

本文共 1437 字,大约阅读时间需要 4 分钟。

Walk

题目描述

给定一棵 \(n\) 个节点的树,每条边的长度为 \(1\),同时有一个权值\(w\)。定义一条路径的权值为路径上所有边的权值的最大公约数。现在对于任意 \(i \in [1,n]\), 求树上所有长度为 \(i\) 的简单路径中权值最大的是多少。如果不存在长度为 \(i\) 的路径,则第 \(i\) 行输出 \(0\)

输入输出格式

输入格式

第一行,一个整数 \(n\),表示树的大小。

接下来 \(n-1\) 行,每行三个整数 \(u,v,w\),表示 \(u,v\) 间存在一条权值为 \(w\) 的边。

输出格式

对于每种长度,输出一行,表示答案。

数据范围及约定

对于 \(30\%\)的数据, \(n \le 1000\)

对于额外 \(30\%\)的数据, \(w \le 100\)
对于 \(100\%\)的数据, \(n \le 4 \times 10^5\)\(1 \le u,v \le n\)\(w \le 10^6\)


蜜汁题目。

思路:枚举每个可能的\(w\),建部分图。

连边要注意一下枚举的方法,不要用memset,像CDQ分治一样撤销。

约数个数大约是\(n^{\frac{3}{2}}\)

复杂度同阶


Code:

#include 
#include
const int N=4e5+10;const int M=1e6+10;int head[N],to[N<<1],Next[N<<1],sta[N<<1],cnt;void add(int u,int v){ to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt,sta[cnt]=u;}struct node{int u,v;}t;int n,m,mxl,mx,used[N],ans[N];std::vector
e[M];int max(int x,int y){return x>y?x:y;}int maxdis(int now,int fa){ used[now]=1; int mx0=0,mx1=0,d; for(int i=head[now];i;i=Next[i]) { int v=to[i]; if(v!=fa) { d=maxdis(v,now); if(d>=mx0) mx1=mx0,mx0=d; else if(d>mx1) mx1=d; } } mxl=mxl>mx0+mx1?mxl:mx0+mx1; return mx0+1;}int main(){ scanf("%d",&n); for(int w,i=1;i
w?mx:w; } for(int i=1;i<=mx;i++) { for(int j=i;j<=mx;j+=i) for(int k=0;k

2018.10.11

转载于:https://www.cnblogs.com/butterflydew/p/9774393.html

你可能感兴趣的文章
【MUI】百度地图定位功能
查看>>
bzoj3687 简单题
查看>>
STL容器简介
查看>>
HashMap遍历的两种方式,推荐使用entrySet()
查看>>
如何在Android开发中测试应用在真机上实验
查看>>
传奇代码研究 极品机率...
查看>>
mysql存储过程和定时调用
查看>>
(转)park1.0.0生态圈一览
查看>>
需要学习双拼了
查看>>
字符串和数组使用时该注意的一些地方
查看>>
我们的故事墙--一切为了可视化
查看>>
进程与线程的区别?-转
查看>>
php array_walk
查看>>
yolo train:CUDA Error: an illegal memory access was encountered darknet: cuda.c:36:check_error
查看>>
java中作用域public private protected 以及不写的区别
查看>>
Ubuntu 安装java 1.8
查看>>
ASP.Net本地化/国际化解决方案原理和代码示例
查看>>
winform无法查看设计器
查看>>
[Json] 1 - 数据格式(转)
查看>>
bootstrap 模态框
查看>>