loj#P3347. 「APIO2020」有趣的旅途

「APIO2020」有趣的旅途

题目描述

注意:在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++ 11
  • C++ 11 (Clang)
  • C++ 11 (NOI)
  • C++ 17
  • C++ 17 (Clang)

雅加达最大的主题公园中有 NN 个景点,它们从 00N1N - 1 编号。这些景点由 N1N - 1 条双向道路连接,任意两个景点间经由这些道路将存在唯一一条简单路径。道路从 00N2N - 2 编号。第 ii 条道路连接第 AiA_i 个景点与第 BiB_i 个景点,经过这条道路需要花费一个小时。为了避免拥塞,每个景点将至多与三条道路相连。

你想寻找一条游玩路线并使得每个景点都被参观一次。你认为从一个景点走到下一个景点时经过太多道路是十分无聊的。为了寻找一条有趣的路线,你打算安排景点的参观顺序,使得参观下一个景点所花费的时间不超过参观之前景点所花费的时间。换句话说,你想找到一个序列 P0,P1,,PN1P_0, P_1, \ldots, P_{N-1} 使其包含 00N1N - 1 中的所有整数恰好一次,并且从第 PiP_i 个景点到达第 Pi+1P_{i+1} 个景点所需的时间不超过从第 Pi1P_{i-1} 个景点到达第 PiP_i 个景点所需的时间,其中 0<i<N10 \lt i \lt N - 1

你手上没有景点的完整地图,因此你必须向信息中心进行若干次询问才能找到一条有趣路线。你最多能进行 QQ 次询问,每次询问需要提供两个参数 XXYY,其中 0X,Y<N0 \le X, Y \lt N。每次询问是以下任意一种:

从第 XX 个景点到第 YY 个景点需要花费多少个小时。特别地,若 X=YX = Y 则回答将是 00

有多少个景点 ZZ 满足,当你想从第 XX 个景点到达第 ZZ 个景点时一定会经过第 YY 个景点。第 YY 个景点将会被计算在内,特别地,若 X=YX = Y 则回答将是 NN

实现细节

你必须引用 fun.h 头文件。

你必须实现 createFunTour 函数:

std::vector<int> createFunTour(int N, int Q)

该函数将被评测库恰好调用一次。

  • NN: 一个整数表示景点的数量。
  • QQ: 一个整数表示询问次数的最大值。

该函数可以调用以下两个交互函数:

int hoursRequired(int X, int Y)
  • XX: 一个整数表示第一个景点的编号。
  • YY: 一个整数表示第二个景点的编号。
  • 该函数将返回一个整数表示从第 XX 个景点到第 YY 个景点需要花费的小时数。
  • 如果 XXYY 的值不在 00N1N - 1 的范围内,该测试点将视为答案错误。
int attractionsBehind(int X, int Y)
  • XX: 一个整数表示第一个景点的编号。
  • YY: 一个整数表示第二个景点的编号。
  • 该函数将返回一个整数表示有多少个景点 ZZ 满足,当你想从第 XX 个景点到达第 ZZ 个景点时一定会经过第 YY 个景点。
  • 如果 XXYY 的值不在 00N1N - 1 的范围内,该测试点将视为答案错误。
  • 该函数必须返回一个长为 NN 的整数序列,表示你找到的景点参观顺序。

样例评测库

样例评测库将读入以下格式的数据:

N Q
A[0] B[0]
A[1] B[1]
.
.
.
A[N-2] B[N-2]

如果 createFunTour 正确返回了一个满足题意的序列,并且 hoursRequiredattractionsBehind 的调用次数总和不超过 QQ,那么样例评测库将会输出 createFunTour 得到的序列。其他情况下样例评测库将会输出错误信息。

7 400000
0 1
0 5
0 6
1 2
1 4
2 3
3 6 4 5 2 0 1

数据范围与提示

对于 100%100\% 的数据,保证:

  • 2N1052 \le N \le 10^5
  • Q=4×105Q = 4\times 10^5
  • 任意两个景点间可以通过双向道路互相到达。
  • 每个景点至多连接着三条道路。

子任务 111010 分)

  • N17N \le 17

子任务 221616 分)

  • N500N \le 500

子任务 332121 分)

  • 对所有的 1i<N1 \le i \lt N,有一条连接着第 ii 个景点与第 i12\left\lfloor\frac{i - 1}{2} \right\rfloor 个景点的双向道路。

子任务 441919 分)

  • 存在至少一个景点 TT 使得对于所有 0i<N0 \le i \lt NhoursRequired(T, i) <30\lt 30 并且存在一个整数区间 [Li,Ri](0LiiRi<N)[L_i, R_i](0 \le L_i \le i \le R_i \lt N) 满足下列条件:

    • 从第 TT 个景点到达第 jj 个景点必须经过第 ii 个景点当且仅当 LijRiL_i \le j \le R_i
    • Li<iL_i \lt i,则恰有一个景点 XX 满足:
      • L[i]X<iL[i] \le X \lt i
      • 有一条连接第 ii 个景点与第 XX 个景点的道路。
    • i<Rii \lt R_i,则恰有一个景点 YY 满足:
      • i<YRii \lt Y \le R_i
      • 有一条连接第 ii 个景点与第 YY 个景点的道路。

子任务 553434 分)

  • 无附加限制。