题目名称 4392.
输入输出 gra.in/out
难度等级 ★★
时间限制 1000 ms (1 s)
内存限制 1024 MiB
测试数据 55
题目来源 GravatarHXF 于2026-04-10加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:5, 提交:7, 通过率:71.43%
GravatarHXF 100 2.013 s 6.33 MiB C++
GravatarRpUtl 100 2.532 s 7.05 MiB C++
Gravatarxuyuqing 100 2.543 s 7.04 MiB C++
Gravatarxuyuqing 100 2.564 s 7.04 MiB C++
Gravatar郑霁桓 100 2.567 s 7.04 MiB C++
Gravatarxuyuqing 45 6.867 s 6.83 MiB C++
Gravatarxuyuqing 45 7.000 s 6.83 MiB C++
本题关联比赛
2026.4.11
关于 的近10条评论(全部评论)

4392. 图

★★   输入文件:gra.in   输出文件:gra.out   交互式+评测插件
时间限制:1 s   内存限制:1024 MiB

【题目背景】

这是一道交互题

【题目描述】

在平面上有 $n$ 个点,第 $i$ 个点的坐标为 $\left(\cos\left(\frac{2i\pi}{n}\right), \sin\left(\frac{2i\pi}{n}\right)\right)$

由题目名称可知,由于这是一道图论题,所以这 $n$ 个点形成了一个无向完全图,每两个点之间都有恰好一条边。比较不同的是,边有两种颜色,黑色和白色。你每次可以询问交互库连接某两点之间边的颜色。

zzq 希望你帮他选出一棵生成树。这棵生成树需要满足,所有边的颜色都相同,并且边两两只在端点处交叉(即组成生成树边的平面上的线段除了共端点以外都不相交)。如果有多个解,你可以任意输出一个。可以证明一定有解。

【交互提示】

选手目录中有 gra.hsample.cpp 两个文件,以下是详细说明,如果懒得看的话你也可以直接参照 sample.cpp 编写代码。

你需要在你代码的开头 #include "gra.h" 来与交互库交互,不应该实现 main 函数或进行任何文件输入输出,你只需要实现一个函数:void tree(int n),它接受节点的数量 $n$,并求出一个合法的生成树。

你可以使用交互库提供的函数:bool query(int a, int b),这个函数接受两个 $[1,n]$ 的不同整数 $a, b$,返回连接 $a$ 和 $b$ 两点的边的颜色,$1$ 表示黑色,$0$ 表示白色。

当你确定了一个合法生成树后,调用恰好 $n−1$ 次函数 void report(int a, int b),这个函数接受两个 $[1,n]$ 的不同整数 $a,b$,表示你的生成树中的一条边。

样例交互库(下发的 gra.h)会从标准输入输入 $n$ 和一个 $n \times n$ 的关于主对角线对称的 $01$ 矩阵,第 $i$ 行第 $j$ 列的元素表示边 $(i,j)$ 的颜色。

【样例输入】

3
0 1 0
1 0 0
0 0 0

【样例输出】

Good job! You found the following
valid spanning tree in 3 steps.
1 3
3 2

样例输出仅为示例。

【提示】

对于所有数据,$2 \le n \le 1000$。

下表中留空表示无此限制。

子任务编号 分数 $n$ 数据生成方式
$1$ $20$ $\le 5$
$2$ $20$ $\le 100$
$3$ $30$ $\ge 100$ 每条边的颜色在黑色和白色中均匀随机
$4$ $30$ $\le 1000$

交互库是 non-adaptive 的,即在调用你的函数之前每条边的颜色就已经确定了。

你在每个测试点上的得分与你调用 query 函数的次数有关。

如果你的调用次数超过 $\frac{n(n-1)}{2}$,那么你将得到 $0$ 分。

否则,设你的调用次数为 $t$,该测试点满分为 $s$,你将得到 $\left\lfloor\max\left(0.3, \min\left(1, \frac{12\max(n, 5)-t}{10n}\right)\right)s\right\rfloor$ 分。

保证正常交互(即你可能获得分数)时交互库不占用超过 0.5s 时间和 100MB 内存。

【附件下载】

gra.zip