#P3837. [IOI2017] Wiring

[IOI2017] Wiring

题目背景

这是一道交互题。

本题仅支持 C++ 系列语言,提交时不需要包含 wiring.h 头文件,但需要在程序开头包含 vector 头文件以及声明函数 long long min_total_length(std::vector<int> r, std::vector<int> b)

由于不可名状的 BUG,使用 C++14 (GCC9) 提交会导致 CE,请不要使用其提交。

题目描述

Maryam 是一位电机工程师。她正在为一座通讯塔设计接线方案。在这个塔上有一些分布在不同高度的连接点。一条电线可以用来将任何两个连接点连接起来。每一个连接点都可以接上任意数目的电线。而连接点共有两种:分别为红色连接点及蓝色连接点。

为了表述方便起见,通讯塔会被视为一条直线,而那些红色及蓝色连接点会被视为在这条直线上的一些非负整数坐标。一条电线的长度是该电线所连接的两个连接点间的距离。

你要做的是帮 Maryam 找出一个接线的方案,使得满足以下条件:

  1. 每个连接点上最少有一条电线连接到一个不同颜色的连接点上

  2. 所用的电线的总长为最短。

实现细节

你需要实现以下的子程序:

long long min_total_length(std::vector<int> r, std::vector<int> b)

  • rr:一个长度为 nn 的数组,其内以升序排列着所有红色连接点的位置。

  • bb:一个长度为 mm 的数组,其内以升序排列着所有蓝色连接点的位置。

  • 这个子程序需返回在所有可能的连接方案中,最短电线总长度的那个方案的电线作为其返回值。

  • 请注意这个子程序的返回值的类型为 long long

输入格式

你需要实现上面所述的子程序。

输出格式

返回一个 long long 值。

r = [1, 2, 3, 7]
b = [0, 4, 5, 9, 10]
10

提示

样例中函数传递参数:

min_total_length([1, 2, 3, 7], [0, 4, 5, 9, 10])

以下的图表表述了样例中的数据。

  • 图中以水平的方式表示出相关的通讯塔。

  • 因题目打印是黑白色的,所以红色接点以较深色来表示,而蓝色接点则以较浅色来表示。

  • 图中有 44 个红色的连接点,其位置分别为 1,2,31,2,377

  • 图中有 55 个蓝色的连接点,其位置分别为 0,4,5,90,4,5,91010

  • 该例的最优解的电线总长度为 1+2+2+2+3=101+2+2+2+3=10 ,所以子程序的返回值为 1010

  • 请注意共有两条电线连接在位置为 77 的连接点上。

限制条件

  • 1n,m1000001 \leqslant n,m \leqslant 100000

  • 0r[i]1090 \leqslant r[i] \leqslant 10^9 (对于所有0in10 \leqslant i \leqslant n-1

  • 0b[i]1090 \leqslant b[i] \leqslant 10^9(对于所有0im10 \leqslant i \leqslant m-1

  • 数组rr及数组bb都已经按升序排好序。

  • 在数组rrbb内的所有n+mn+m个值均是不同的。

子任务

  1. (77 分) n,m200n,m\leqslant 200

  2. (1313 分) 所有红色接点的位置坐标小于任何蓝色接点的坐标。

  3. (1010 分) 在每77个连续的(接续)的连接点内必有最少一个红色接点及蓝色接点。

  4. (2525 分) 所有接点在[1,n+m][1,n+m]范围内有不同的位置坐标。

  5. (4545 分) 没有任何附加的限制。