训练地址:vjudge链接
C.Min-Max Array Transformation
其实我们可以从题目中看出,主要是求解两个问题。
第一个求解问题,\(d_{min}\),对于每一个\(a_i\),第一个大于其的\(b_i\)就是我们想找的\(d_{min}\)。
第二个求解问题,\(d_{max}\),显然是在可以的基础上,使得\(a_i\)尽可能地与最右侧的\(b_j\)联系在一起,但是呢,得保证中间其他的\(a_i\)也有相应的\(b_j\)与之对应。
for (int i = 0, j = 0; i < n; i++) {
while (b[j] < a[i]) {
j++;
}
cout << b[j] - a[i] << " \n"[i == n - 1];
}
for (int i = 0, j = 0; i < n; i++) {
j = std::max(j, i);
while (j + 1 < n && a[j + 1] <= b[j]) {
j++;
}
cout << b[j] - a[i] << " \n"[i == n - 1];
}
下图为官方题解——