#L3989. 「IOI2023」最长路程
「IOI2023」最长路程
题目描述
IOI 2023 组委会需要规划 Ópusztaszer 之旅,当地有 个地标(编号 到 ),部分地标间连有双向道路,且组委会不知道具体连接情况,但已知存在正整数 (),使得路网密度至少为 。
路网密度定义
若对所有满足 的地标三元组 ,其两两配对 、、 中至少有 条道路相连,则称路网密度至少为 。
询问规则
组委会可通过调用 are_connected
函数询问接线员,每次询问需满足:
- 给出两个非空数组 和 ;
- 数组内元素两两不同( 中无重复, 中无重复);
- 与 无交集(所有 )。
接线员的返回结果为:若存在 与 之间有道路,则返回 true
;否则返回 false
。
最长路程定义
- 路程:由不同地标构成的序列 ,满足对所有 , 与 间有道路。
- 最长路程:若不存在长度至少为 的路程,则长度为 的路程是最长路程。
你的任务是通过询问,找到一条最长路程并返回其地标序列。
实现细节
需在程序开始引入库 longesttrip.h
,并实现以下函数:
int[] longest_trip(int N, int D)
参数说明
- :地标总数;
- :路网密度的最小值()。
返回要求
- 返回一个数组 ,表示某条最长路程的地标序列;
- 若返回数组长度不符要求(如非最长路程)、元素非合法地标编号,将被判错。
可调用函数
bool are_connected(int[] A, int[] B)
调用限制
- 单次
longest_trip
调用中,are_connected
调用次数至多 次; - 所有
are_connected
调用累计次数至多 次; - 所有调用中,数组 和 的累计长度之和至多 。
例子
例子 1
考虑某个 N = 5, D = 1 的场景,其中道路连接情形如下图所示:
例子 2()
若路网中道路仅为 、,则最长路程长度为 ,函数可返回 、 等序列。
约束条件
- ;
- 所有
longest_trip
调用中, 的累计总和至多 ; - 。
子任务
子任务 | 附加限制 | 分值 |
---|---|---|
1 | ||
2 | ||
3 | ,返回路程长度至少为 ( 为最长路程长度)即可 | |
4 | ,需返回最长路程,得分与 are_connected 调用次数挂钩 |
子任务 4 得分规则
设单次 longest_trip
调用中 are_connected
的最大调用次数为 :
- : 分;
- : 分;
- : 分;
- : 分。
评测程序示例
输入格式
- 第 行:(场景数,即
longest_trip
调用次数); - 每个场景描述:
- 第 行:;
- 第 行():数组 (长度 ), 表示地标 与 有道路, 表示无道路。
输出格式
- 若路网密度不足 ,输出
Insufficient Density
并中止; - 若存在调用违规(如数组无效、询问次数超限),输出
Protocol Violation: <MSG>
; - 每个场景的合法结果:
- 第 行:返回路程的长度 ;
- 第 行:返回的地标序列;
- 第 行:该场景中
are_connected
的调用次数;
- 最后一行:所有
longest_trip
调用中are_connected
的最大调用次数。