[CSP-S模拟测试]:Walk(树的直径+数学)
题目描述
给定一棵$n$个节点的树,每条边的长度为$1$,同时有一个权值$w$。定义一条路径的权值为路径上所有边的权值的最大公约数。现在对于任意$i\in [1,n]$,求树上所有长度为$i$的简单路径中权值最大的是多少。如果不存在长度为$i$的路径,则第$i$行输出$0$。
输入格式
第一行,一个整数$n$,表示树的大小。
接下来$n-1$行,每行三个整数$u,v,w$,表示$u,v$间存在一条权值为$w$的边。
输出格式
对于每种长度,输出一行,表示答案。
样例
样例输入:
3
1 2 3
1 3 9
样例输出:
9
3
0
数据范围与提示
对于$30\%$的数据,$n\leqslant 1,000$。
对于额外$30\%$的数据,$w\leqslant 100$。
对于$100\%$的数据,$n\leqslant 4\times 10^5,1\leqslant u,v\leqslant n,w\leqslant 10^6$。
题解
直接处理很难,考虑如何转化问题。
将问题反过来,也就是转化为对于每一个$gcd$,将其倍数的边建树,建成一棵森林,求树的直径,对于一样的直径,我们只要那棵$gcd$最大的树的$gcd$就好了。
时间复杂度:$\Theta(n\sqrt{w})$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct node{int nxt,to,w;}e[800000];
int head[400001],cnt;
int n;
int mxw;
int ans[400001];
int mx[400001];
bool vis[400001];
int sta[800001];
vector<pair<int,int>>tr[1000001];
void pre_work()
{
for(int i=1;i<=sta[0];i++)
{
head[sta[i]]=0;
vis[sta[i]]=0;
}
cnt=sta[0]=mxw=0;
}
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void dfs(int x,int fa)
{
mx[x]=0;
vis[x]=1;
int maxn=0;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa)dfs(e[i].to,x);
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa)
if(mx[x]<=mx[e[i].to])
{
maxn=mx[x];
mx[x]=mx[e[i].to]+1;
}
else if(maxn<=mx[e[i].to])maxn=mx[e[i].to]+1;
mxw=max(mxw,mx[x]+maxn);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
tr[w].push_back(make_pair(u,v));
}
for(int i=1;i<=1000000;i++)
{
pre_work();
for(int j=i;j<=1000000;j+=i)
{
for(int k=0;k<tr[j].size();k++)
{
add(tr[j][k].first,tr[j][k].second);
add(tr[j][k].second,tr[j][k].first);
sta[++sta[0]]=tr[j][k].first;
sta[++sta[0]]=tr[j][k].second;
}
}
for(int j=1;j<=sta[0];j++)
if(!vis[sta[j]])
dfs(sta[j],0);
ans[mxw]=i;
}
for(int i=n;i;i--)ans[i]=max(ans[i],ans[i+1]);
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
return 0;
}
rp++
[CSP-S模拟测试]:Walk(树的直径+数学)的更多相关文章
- [CSP-S模拟测试]:超级树(DP)
题目传送门(内部题5) 输入格式 一行两个整数$k$.$mod$,意义见上. 输出格式 一行一个整数,代表答案. 样例 样例输入1: 2 100 样例输出1: 样例输入2: 3 1000 样例输出2: ...
- [CSP-S模拟测试]:砍树(数学+模拟)
题目传送门(内部题1) 输入格式 第一行两个整数$n$,$k$,代表树苗的数量和最大看书的总长度.第二行n个整数$a_i$,代表林先森希望每棵树苗的最终高度. 输出格式 一行一个整数,代表最大可能的d ...
- [CSP-S模拟测试]:Walk(BFS+建边)
题目描述 在比特镇一共有$n$个街区,编号依次为$1$到$n$,它们之间通过若干条单向道路连接. 比特镇的交通系统极具特色,除了$m$条单向道路之外,每个街区还有一个编码${val}_i$,不同街区可 ...
- [CSP-S模拟测试]:数学课(找规律+数学)
题目传送门(内部题145) 输入格式 从$math.in$读入数据. 第一行两个数,为$n,q$.接下来$q$行每行一个数$m$,询问大小为$m$的$A$一共有多少个. 输出格式 输出答案到$math ...
- [CSP-S模拟测试]:随(快速幂+数学)
题目描述 给出$n$个正整数$a_1,a_2...a_n$和一个质数mod.一个变量$x$初始为$1$.进行$m$次操作.每次在$n$个数中随机选一个$a_i$,然后$x=x\times a_i$.问 ...
- [CSP-S模拟测试]:神炎皇(数学)
题目描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对$(a,b)$,若满足$a+b\leqslant n$且$a+b$是$ab$的因子,则称为神奇的数对.请问这样的数对共有多少呢? ...
- [CSP-S模拟测试]:Seat(概率DP+数学)
题目描述 有$n+2$个座位等距地排成一排,从左到右编号为$0$至$n+1$.最开始时$0$号以及$n+1$号座位上已经坐了一个小$G$,接下来会有$n$个小$G$依次找一个空座位坐下.由于小$G$们 ...
- [CSP-S模拟测试]:夜鹰与玫瑰(数学)
题目描述 红晕爬上了白玫瑰的花瓣,花刺还没有到达夜莺的心脏,玫瑰的心依旧苍白如终年不化的积雪.由生命铸就的玫瑰不允许存在一丝一毫的瑕疵,假设玫瑰的一片花瓣可以抽象成一个点,一朵玫瑰我们用一个$N\ti ...
- [CSP-S模拟测试]:玄学题/c(数学)
题目传送门(内部题40) 输入格式 第一行:两个正整数$n$.$m$. 输出格式 第一行:一个整数,代表式子的值. 样例 样例输入1: 4 5 样例输出1: 0样例输入2: 799 8278 样例输出 ...
随机推荐
- 深入理解任何Binder Client都可以直接通过ServiceManager的0这个Binder句柄创建一个BpBinde
ServiceManager是安卓中一个重要的类,用于管理所有的系统服务,维护着系统服务和客户端的binder通信.对此陌生的可以先看系统服务与ServiceManager来了解应用层是如何使用Ser ...
- Ultra.Base
winform 基础类库 https://github.com/ZixiangBoy/Ultra.Base
- vue复合组件----注册表单
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java中的常用类:包装类、String、StringBuffer、StringBuilder、Math、System、Arrays、BigInteger、BigDecimal、Data、Calendar
一.包装类 √ 二.String类 ★ 三.StringBuffer和StringBuilder类 ★ 四.Math类 五.System类 六.Arrays类 七.BigInteger类和BigDec ...
- 自动生成脚本头部格式并调用VIM工具
在我们写脚本的时候,开始总要按照脚本书写规范来定义脚本头部格式,久而久之是不是会觉得麻烦效率低下呢,这里就介绍一个好的思路给大家. 1 首先我们在VIM里先复制个头部格式的内容,这里就抄袭一个二师兄的 ...
- Xilinx源语-------FDRE
1.源语---FDRE FDRE代表一个单D型触发器,含的有五个信号分别为: 数据(data,D).时钟使能(Clock enable,CE).时钟(Clock).同步复位(synchronous ...
- mysql考试复习
基础创建 字段自动编号auto_increment ( 单词补充:increment 定期的加薪; 增量; 增加) 考点 添加自增 alter table [表名] modify [字段(id)] i ...
- SSH简单概念
Spring:轻量级控制反转(IoC)和面向切面(AOP)的容器框架,让对象与对象之间的关系通过配置文件来管理,减低耦合度 IoC:凡是在容器中配置过的对象才会有Spring提供的服务和功能 AOP: ...
- R语言封装函数
R语言封装函数 原帖见豆瓣:https://www.douban.com/note/279077707/ 一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分. 1. 函数名称,即要 ...
- 237-基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡
基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡 一. 板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...