直径
直径
题目描述
上午讲了构造题,下午就放一道构造题。你需要构造一棵至少有两个顶点的树,树上的每条边有一个非负整数边权。树上两点 i,ji,ji,j 的距离 dis(i,j)dis(i,j)dis(i,j) 定义为树上连接iii 和 jjj 这两点的简单路径上的边权和。
我们定义这棵树的直径为,所有满足 1≤i<j≤n1\leq i<j \leq n1≤i<j≤n 的 (i,j)(i,j)(i,j) 中,dis(i,j)dis(i,j)dis(i,j) 最大的。如果有多个这样的 (i,j)(i,j)(i,j),那么均为直径。
作为一个构造题,你需要构造一个恰有 kkk 个直径的树。可以证明在给定的限制下一定有解。
输入格式
一行一个正整数 kkk,表示你需要构造出一个恰有 kkk 个直径的树。
输出格式
第一行一个正整数 nnn,表示你构造的树的点数。
接下来 n−1n-1n−1 行,每行三个整数 i,j,wi,j,wi,j,w,表示一条连接点 iii 和 jjj (点的编号为1,2⋯n1,2 \cdots n1,2⋯n)的树边,边权为 www。
样例
样例输入
3
样例输出
5
1 2 2
3 2 2
2 5 3
4 2 2
样例解释
这只是一种符合题意的输出,可能还有其他输出。在这个输出中,直径为 (1,5),(3,5),(4,5)(1,5),(3,5),(4,5)(1,5),(3,5),(4,5)。
数据范围与提示
对于所有数据,1≤k≤50000001 \leq k \leq 50000001≤k≤5000000。
你构造的树需要保证 2≤n≤50002 \leq n \leq 50002≤n≤5000,且每条边的边权满足 0≤w≤1050 \leq w \leq 10^50≤w≤105。
Subtask 1(10pts):1≤k≤51 \leq k \leq 51≤k≤5。
Subtask 2(20pts):1≤k≤20001 \leq k \leq 20001≤k≤2000。
Subtask 3(30pts):1≤k≤2000001 \leq k \leq 2000001≤k≤200000。
Subtask 4(20pts):1+8k\sqrt{1+8k}√1+8k 为整数。
Subtask 5(20pts):无特殊限制。
solution
如果k可以被分解成两个和<5000的数之积,那么就可行
考虑这样的构造
1 2 10
1 3 10
2 a 1
3 b 1
直径数量a*b
现在考虑k不能被分解
我们考虑同上分解成3部分abc
即ab+ac+bc=k
(a+c)(b+c)=k+c*c
那么我们尝试枚举c并尝试分解k+c*c
可以发现不难出解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构