loj#P2867. 「IOI2018」高速公路收费
「IOI2018」高速公路收费
题目描述
在 LibreOJ 上,由于语言与交互库的限制,本题仅支持以下语言提交:
- C++ 11
- C++ 17
在日本,城市是用一个高速公路网络连接起来的。这个网络包含 个城市和 条高速公路。每条高速公路都连接着两个不同的城市。不会有两条高速公路连接相同的两个城市。城市的编号是从 到 ,高速公路的编号则是从 到 。每条高速公路都可以双向行驶。你可以从任何一个城市出发,通过这些高速公路到达其他任何一个城市。
使用每条高速公路都要收费。每条高速公路的收费都会取决于它的交通状况。交通状况或者为顺畅,或者为繁忙。当一条高速公路的交通状况为顺畅时,费用为 日元(日本货币),而当交通状况为繁忙时,费用为 日元。这里必有 。注意, 和 的值对你是已知的。
你有一部机器,当给定所有高速公路的交通状况后,它就能计算出在给定的交通状况下,在两个城市 和 ()之间旅行所需要的最小的高速总费用。
然而,这台机器只是一个原型。所以 和 的值是固定的(即它已经被硬编码到机器中),但是你并不知道它们的值是什么。你的任务就是去找出 和 的值。为了找出答案,你打算先给机器设定几种交通状况,然后利用它输出的高速费用来推断出 和 。由于设定高速公路交通状况的代价很大,所以你并不想使用这台机器很多次。
实现细节
你需要在开始包含 highway.h
库文件,并实现下面的过程:
find_pair(int N, int[] U, int[] V, int A, int B)
N
:城市的数量。U
及V
:长度为 的数组,其中 为连接城市的高速公路的数量。对于每个 (),高速公路 连接城市U[i]
和V[i]
。A
:交通状况顺畅时高速公路的收费。B
:交通状况繁忙时高速公路的收费。- 对于每个测试样例,该过程会被调用恰好一次。
- 注意, 为数组的长度,所有数组均为
vector
。
过程 find_pair
可以调用以下函数:
int64 ask(int[] w)
w
的长度必须为 。 数组w
描述高速公路的交通状况。- 对于每个 (),
w[i]
表示高速公路 的交通状况。w[i]
的值必须为 或 。w[i] = 0
表示高速公路 的交通状况为顺畅。w[i] = 1
表示高速公路 的交通状况为繁忙。
- 该函数返回的是,在
w
所描述的交通状况下,在城市 和 之间旅行所需的最少总费用。 - 该函数最多只能被调用 次(对于每个测试样例)。
find_pair
应调用以下过程来报告答案:
answer(int s, int t)
s
和t
的值必须为城市 和 (两者的先后次序并不重要)。- 该过程必须被调用恰好一次。
如果不满足上面的条件,你的程序将被判为 Wrong Answer
。否则,你的程序将被判为 Accepted
,而你的得分将根据 ask
的调用次数来计算(参见子任务)。
输入格式
评测程序示例将读取如下格式的输入:
- 第一行:
- 第 行():
如果你的程序被判为 Accepted
,评测程序示例将打印出 Accepted: q
,这里的 q
为函数 ask
被调用的次数。
如果你的程序被判为 Wrong Answer
,它打印出 Wrong Answer: MSG
。各类 MSG
的含义如下:
answered not exactly once
:过程answer
没有被调用恰好一次。w is invalid
:传给函数ask
的w
的长度不是 ,或者某个 ()上的w[i]
既不是 也不是 。more than 100 calls to ask
:函数ask
的调用次数超过 次。{s, t} is wrong
:调用answer
时的s
和t
是错的。
数据范围与提示
对于全部数据:
- $2\le N\le 9\times 10^4,1\le M\le 1.3\times 10^5,1\le A\lt B\le 10^9$
- 对于每一个
- 保证数据无重边。
- 你可以从任何一个城市出发,通过高速公路到达其他任何一个城市。
在本题中,评测程序不是适应性的。意思是说,在评测程序开始运行的时候 和 就固定下来,而且不依赖于你的程序所做的询问。
子任务
- (5 分) 或 有一个是 ,
- (7 分) 或 有一个是 ,
- (6 分)
- (33 分)
- (18 分)
- (31 分) 没有附加限制。
假设你的程序被判为 Accepted
,而且函数 ask
调用了 次。你在该测试样例上的得分 ,取决于对应子任务的编号,其计算如下:
- 子任务 1:
- 子任务 2:如果 ,。否则 。
- 子任务 3:如果 ,。否则 。
- 子任务 4:如果 ,。否则 。
- 子任务 5:如果 ,。否则 。
- 子任务 6:
- 如果 ,。
- 如果 ,。
- 如果 ,。
注意,你在每个子任务上的得分,等于你在该子任务中所有测试样例上的最低得分。