题目大意
在一维数轴上有p个水栓和f辆救护车。现在要为每个救护车匹配一个水栓,使得距离和最小。一个水栓最多只能被一辆救护车匹配。
f≤p≤100000
分析
救护车匹配水栓可以分成两种方向。
在最优方案中有以下性质:
两种方向的两个匹配只有相离的关系
同向的两个匹配可以通过不影响答案的调整使得两两关系为相离或包含
被匹配的物品必然是连续的一段
然后就可以按它们在数轴上的位置从小到大枚举。分两种情况:
水栓:容易求出它上一个匹配的是哪一个(通过上面的性质得出一个括号序),然后匹配过来,中间的答案就由前缀和计算;当然它也可以不被选,就从上一个物品直接转移过来
救护车:容易求出它上一个匹配的是哪一个(上面情况的括号序取反),然后匹配过来,中间的答案用前缀和计算。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N