[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 样例输出 ...
随机推荐
- struts2 token 防止表单重复提交
1.jsp页面 输入框,提交按钮 <%@ page language="java" contentType="text/html" pageEncodi ...
- Vue Router:使用 props 将组件和路由解耦
在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性. 可以使用 props 将组件和路由解耦. 一 路由配置(布尔模式): impo ...
- SVN检出新项目
1.新建文件夹SourseCode -->打开SourseCode文件夹,右键空白处 ---> 选择SVN Checkout --选择URL of repository,选择Checkou ...
- 手把手教你用Pytorch-Transformers——实战(二)
本文是<手把手教你用Pytorch-Transformers>的第二篇,主要讲实战 手把手教你用Pytorch-Transformers——部分源码解读及相关说明(一) 使用 PyTorc ...
- display:table
display:table的CSS声明能够让一个HTML元素和它的子节点像table元素一样.使用基于表格的CSS布局,使我们能够轻松定义一个单元格的边界.背景等样式,而不会产生因为使用了table那 ...
- hasattr() getattr() setattr() 函数使用详解??
hasattr(object, name)函数: 判断一个对象里面是否有name属性或者name方法,返回bool值,有name属性(方法)返回True,否则返回False. **注意:name要使用 ...
- adb 链接网络 connect 安装apk install 断开IP链接 kill-server 连接数devices
https://blog.csdn.net/zhonglunshun/article/details/78362439 ./adb connetc 192.168.1.11 ./adb install ...
- 2018-2-13-win10-uwp-smms图床
title author date CreateTime categories win10 uwp smms图床 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 1 ...
- dict/json转xml
在json转xml时,首先传进来的一定是一个dict,如果不是需要转一下,然后开始迭代,遇到dict则递归,如果是list则循环递归,否则认为是文字,将其写入,逻辑不复杂,因为为了代码循环不是太频繁, ...
- unixbench
1.下载 https://github.com/kdlucas/byte-unixbench/archive/v5.1.3.tar.gz 2.修改Makefile 交叉编译 #CC=gccCC = a ...