直径

直径

题目描述

上午讲了构造题,下午就放一道构造题。你需要构造一棵至少有两个顶点的树,树上的每条边有一个非负整数边权。树上两点 i,ji,ji,j 的距离 dis(i,j)dis(i,j)dis(i,j) 定义为树上连接iii 和 jjj 这两点的简单路径上的边权和。

我们定义这棵树的直径为,所有满足 1≤i<j≤n1leq i<j leq n1i<jn 的 (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-1n1 行,每行三个整数 i,j,wi,j,wi,j,w,表示一条连接点 iii 和 jjj (点的编号为1,2⋯n1,2 cdots n1,2n)的树边,边权为 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 50000001k5000000。

你构造的树需要保证 2≤n≤50002 leq n leq 50002n5000,且每条边的边权满足 0≤w≤1050 leq w leq 10^50w105​​。

Subtask 1(10pts):1≤k≤51 leq k leq 51k5。

Subtask 2(20pts):1≤k≤20001 leq k leq 20001k2000。

Subtask 3(30pts):1≤k≤2000001 leq k leq 2000001k200000。

Subtask 4(20pts):1+8ksqrt{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

可以发现不难出解。

 
原文地址:https://www.cnblogs.com/liankewei/p/10389671.html