2023春训练3

训练地址: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++;
        }
        std::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++;
        }
        std::cout << b[j] - a[i] << " \n"[i == n - 1];
    }

下图为官方题解——
image
自己最终提交的代码——qiansui_code

posted on 2023-03-03 23:03  Qiansui  阅读(16)  评论(0编辑  收藏  举报