luogu#P11597. [NOISG 2018 Finals] City Mapping【缺样例】

    ID: 35518 远端评测题 1000ms 512MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>2018二分交互题Special JudgeO2优化树链剖分NOISG(新加坡)

[NOISG 2018 Finals] City Mapping【缺样例】

题目背景

译自 NOISG 2018 Finals D. City Mapping


当你在洛谷提交本题时,需要注意:

  • 本题仅支持 C++ 系列语言。
  • 你的代码中不应该包含头文件 citymapping.h
  • 你的代码中应当有如下两行函数声明:
    long long get_distance(int X, int Y);
    void find_roads(int N, int Q, int A[], int B[], int W[]);
    

如遇评测问题,请联系搬题人。

题目描述

这是一道交互题。

Silvermill 市是一座有 NN 个路口和 N1N-1 条道路的城市。其中道路的编号为 00N2N-2

ii 条道路双向连接了 (Ai,Bi)(A_i,B_i) 两个路口,从任意方向通过这条道路都需要花费 WiW_i 分钟。保证任意两个路口之间都能通过道路互相到达。

为了避免交通堵塞,Silvermill 市的每个路口连接的道路不会超过 33

你的任务是画出 Silvermill 市的地图,也就是找出所有 N1N-1 条道路的 (Ai,Bi,Wi)(A_i,B_i,W_i)

为了达到这个目的,你可以询问市长至多 QQ 次从任意一个路口 XX 到任意一个路口 YY 最少需要多少分钟。

实现细节

在本题中,你不需要,也不应该实现主函数

你需要实现如下函数:

void find_roads(int N, int Q, int A[], int B[], int W[])

该函数包含两个输入参数和三个输出参数,将在评测时被运行恰好一次。输入参数为 N,QN,Q,分别表示路口的数量和最大询问次数;输出参数为 A,B,WA,B,W,你需要确定城市中的 N1N-1 条道路,按题意中的含义以数组 A,B,WA,B,W 的形式返回。返回道路的顺序可以是任意的,同一道路端点的顺序也可以是任意的。

注意数组的下标是从 00 开始的。

你可以调用下面的函数来完成任务:

long long get_distance(int X, int Y)

该函数将返回一个整数,表示从路口 XX 到路口 YY 最少需要多少分钟。如果你调用此函数超过 QQ 次,或提供无效的路口编号作为参数,程序将立刻终止,你将得到 Wrong Answer 的评测状态。

输入格式

示例测试程序如下方式读入数据:

第一行三个整数 N,Q,SN,Q,S,分别表示路口的数量、最大询问次数和子任务编号。

之后是 N1N-1 行,每行三个整数 (Ai,Bi,Wi)(A_i,B_i,W_i),描述一条道路。

输出格式

示例测试程序可能会产生的输出如下:

  • Wrong Input Format,意味着对示例测试程序的输入格式有误。
  • Wrong Answer: Reported list of edges differ from actual.,意味着你确定的道路与实际情况不符。
  • Wrong Answer: get_distance() arguments out of range.,意味着你在询问时提供了无效的路口编号作为参数。
  • Wrong Answer: Too many calls to get_distance().,意味着你超出了最大询问次数限制。
  • 包含两行信息,分别是 Score: s%Correct: x out of y queries used.,意味着你获得了该测试点 s%s\% 的分数,最大询问次数为 yy 次,你使用了其中的 xx 次。

提示

调用示例

我们考虑如下的城市地图,展示一种可能的函数调用过程。

假设此时最大询问次数 Q=5×105Q=5\times 10^5

你的函数将这样被调用恰好一次:

find_roads(5, 500000, A, B, W);

其中 A,B,WA,B,W 是定义在测试程序中的数组。

一种可能的交互过程如下:

  • get_distance(5, 4) = 10get_distance 函数返回从路口 55 到达路口 44 的最少分钟数。路线 5345\to 3\to 4 是最短的,需要 1010 分钟。
  • get_distance(2, 4) = 1get_distance 函数返回了从路口 22 到达路口 44 的最少分钟数。直接从 22 走到 44 是最短的,需要 11 分钟。
  • get_distance(1, 3) = 15get_distance 函数返回了从路口 11 到达路口 33 的最少分钟数。路线 1431\to 4\to 3 是最短的,需要 1515 分钟。
  • get_distance(1, 2) = 9get_distance 函数返回了从路口 11 到达路口 22 的最少分钟数。路线 1421\to 4\to 2 是最短的,需要 99 分钟。

此时,我们假设你的 find_roads 函数认为自己已经掌握了足够的信息,可以推导出正确的地图,所以将 A,B,WA,B,W 数组分别赋值为 A=[3,4,4,5],B=[4,1,2,3],W=[7,8,1,3]A=[3,4,4,5],B=[4,1,2,3],W=[7,8,1,3],然后终止。

这只是一种可能的答案,因为返回道路的顺序可以是任意的,同一道路端点的顺序也可以是任意的。

子任务

对于 100%100\% 的数据,2N10002\le N\le10001Ai,BiN1\le A_i,B_i\le N1Wi1091\le W_i\le 10^9

子任务 得分 QQ 特殊性质及备注
11 99 =5×105=5\times 10^5 Wi=1W_i=1
22 1616 无特殊限制
33 1313 =12000=12000 每个路口最多连接两条道路,且 Wi=1W_i=1
44 1919 每个路口最多连接两条道路
55 4343 =25000=25000 无特殊限制,但有特殊的计分规则(请参阅计分细则

计分细则

子任务 55 适用于以下的计分规则。你的得分依赖于你实现的函数询问的次数 qq

  • 如果 q>25000q>25000,你将获得 00 分。
  • 如果 12000<q2500012000<q\le 25000,你将获得 1010×q120001300010-10\times \frac{q-12000}{13000} 分。
  • 如果 6500<q120006500<q\le 12000,你将获得 4030×q6500550040-30\times \frac{q-6500}{5500} 分。
  • 如果 q6500q\le 6500,你将获得 4343 分。

本地测试方式

我们在附件中下发了示例测试程序 grader.cpp,头文件 citymapping.h,你所需完成的代码的示例 citymapping.cpp,以及编译文件 compile.sh

将这些文件置于同一文件夹下,使用 compile.sh 编译并运行生成的可执行文件,即可进行本地测试。

下发的示例测试程序与提交后使用的测试程序有所不同。

注意提交到洛谷上时有特殊的要求。