提交时请选择高于 C++17 的语法标准,不要引入头文件 gems.h。
第一千届收集宝石大赛开始了!
观众们都厌倦了发生在线性序列上的集宝问题,因此本次大赛相比历届有着明显的创新:参赛选手现在需要在一棵 个结点的无根树上收集宝石。
这棵树上一共有 颗宝石,其中第 () 颗宝石拥有相应的二元组参数 ,表示当一名选手当前到达结点 的简单路径所含边数不超过 时,他就可以选择立刻收集这颗宝石(当然,也可以选择不收集)。
相应地,本次大赛的选手也热情高涨,总共有 名选手报名参赛。对于每名选手,他将会被分配一个出发结点 与一个收集宝石的区间 ,他需要完成以下任务:从结点 出发,不断选择当前结点的一条邻边并移动过去,依次收集第 至第 颗宝石,即按照 的顺序收集所有 颗宝石。
因为每名选手在参赛过程中都遇到了或多或少的路线规划难题,为了给出合理的评分,主办方找到了你。请你对每一名选手,计算出该选手完成收集任务所需移动的最小总边数。
【实现细节】
选手不需要,也不应该实现 main 函数。
选手需要确保提交的程序包含头文件 gems.h,即在程序开头加入以下代码:
选手需要在提交的程序源文件 gems.cpp 中实现以下两个函数:
void gems(int c, int n, int m, std::vector<int> u, std::vector<int> v, std::vector<int> a, std::vector<int> d);
- 分别表示测试点编号、树的结点数与宝石的数量。 表示该测试点为样例。
- 对于 , 表示树的一条边。
- 对于 , 表示第 颗宝石的两个参数。
- 对于每个测试点,该函数会被交互库调用恰好一次,且在所有
query 函数调用之前。
long long query(int x, int l, int r);
- 分别表示一名选手的出发结点与收集宝石的区间。
- 该函数需要返回该选手从结点 出发,依次收集第 至第 颗宝石所需移动的最小总边数。
- 对于每个测试点,该函数会被交互库调用恰好 次。
【测试程序方式】
选手可以在本题目录下使用如下命令编译得到可执行程序:
g++ grader.cpp gems.cpp -o gems -O2 -std=c++14 -static