AT_abc019_4 [ABC019D] 高橋くんと木の直径

题目描述

高桥君正沉迷于求树的直径。树是一种由顶点和连接这些顶点的边组成的结构(“图”中的一种),如果顶点数为 $N$,则边的数量为 $N-1$,并且任意两个顶点都通过边直接或间接连通。 在本题中,每条边都有一个整数权重。定义两个顶点之间的距离为连接这两个顶点的路径上所有边权的和。 树的直径指的是所有顶点对中距离最大的那一对顶点之间的距离。 比如,考虑如下的树。边上的数字表示该边的权重。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/AT_abc019_4/a33a3d0111cd3e05457375697b0a6985f92b86a4.png) 在这个例子中,顶点 $1$ 和 $2$ 之间的距离为 $1$,顶点 $2$ 和 $4$ 之间的距离为 $1+2=3$。顶点 $3$ 和 $5$ 之间的距离为 $3+4=7$,顶点 $4$ 和 $5$ 之间的距离也是 $2+1+4=7$。这个树中最大的距离是 $7$,因此树的直径为 $7$。 高桥君对通过顶点数和两点间距离信息来求树的直径产生了兴趣。本题中,你将首先获得树的顶点数 $N$,然后可以多次询问任意两点之间的距离,最终要求你求出树的直径。 不过,询问两点间距离的次数有限制。 请在限定的询问次数内,编写程序求出树的直径。

输入格式

首先,树的顶点数 $N$ 通过标准输入给出。 > $N$ 接下来,你的程序可以多次向评测程序发起询问。询问的格式如下: > ? $a$ $b$ 通过这个询问,你可以获得 $a$ 和 $b$ 之间的距离,评测程序会将结果通过标准输入返回一行。要求 $1 \leq a, b \leq N$ 且 $a \neq b$。 在进行若干次询问后,你需要输出树的直径。假设树的直径为 $diameter$,则输出格式如下: > ! $diameter$ 输出树的直径后,程序必须立即结束。如果没有立即结束,评测结果将不确定。 如果输出格式不符合上述要求,评测结果也将不确定。 本题每个测试点都有限定的最大询问次数。如果你的询问次数超过上限,将被判为错误。 判定正误以你输出的树的直径为准。即使你的询问不能唯一确定直径,只要输出的直径是正确的,也会被判为正确。 - - - - - - 以下是一些语言中,如何询问顶点 $1$ 和 $2$ 之间距离并读取结果 $dist$ 的示例。 注意,输出后需要刷新缓冲区(flush),否则可能会TLE。 C ``` printf("? %d %d\n", 1, 2); fflush(stdout); scanf("%d", &dist); ``` C++ ``` cout

输出格式

无特殊输出格式说明,见题目描述。

说明/提示

### 限制 - $2 \leq N \leq 50$ - $1 \leq$(每条边的权重)$\leq 10^6$ ### 部分分 本题设置了部分分。 - 有 $20$ 分的测试点,询问次数上限为 $1300$ 次。 - 另有 $80$ 分的测试点,询问次数上限为 $100$ 次。 ### 输入输出样例 当树的结构如下图所示时: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/AT_abc019_4/cee5f2e74e5e3c979be3ad1dfb861be11590dd76.png) 可能的输入输出如下: 程序输入 程序输出 5 ? 1 2 5 ? 2 4 1 ? 4 5 2 ? 2 3 9 ? 1 5 8 ! 14 这只是输入输出的一个例子,未必是有意义的询问。 由 ChatGPT 4.1 翻译