CF1418B Negative Prefixes

题目描述

给定一个由 $n$ 个整数构成的数组 $a$。 数组中的每个位置 $i$($1 \le i \le n$)要么是锁定的,要么是未锁定的。你可以将所有未锁定位置上的值取出,任意重新排列后放回这些未锁定的位置。你不能移除任何值,也不能添加新值,也不能改变锁定位置上的值。你可以选择不改变未锁定位置上的值顺序。 例如,设 $a = [-1, 1, \underline{3}, 2, \underline{-2}, 1, -4, \underline{0}]$,下划线表示锁定的位置。你可以得到如下数组: - $[-1, 1, \underline{3}, 2, \underline{-2}, 1, -4, \underline{0}]$; - $[-4, -1, \underline{3}, 2, \underline{-2}, 1, 1, \underline{0}]$; - $[1, -1, \underline{3}, 2, \underline{-2}, 1, -4, \underline{0}]$; - $[1, 2, \underline{3}, -1, \underline{-2}, -4, 1, \underline{0}]$; - 以及其他一些排列。 设 $p$ 为数组 $a$ 重新排列后的前缀和序列。即 $p_1 = a_1$,$p_2 = a_1 + a_2$,$p_3 = a_1 + a_2 + a_3$,$\dots$,$p_n = a_1 + a_2 + \dots + a_n$。 定义 $k$ 为最大的 $j$($1 \le j \le n$),使得 $p_j < 0$。如果不存在 $j$ 使得 $p_j < 0$,则 $k = 0$。 你的目标是通过重新排列未锁定位置上的值,使得 $k$ 尽可能小。 请输出重新排列后的数组 $a$,使得对应的 $k$ 最小。如果有多种方案,输出任意一种即可。

输入格式

第一行包含一个整数 $t$($1 \le t \le 1000$),表示测试用例的数量。 接下来有 $t$ 组测试数据。 每组测试数据的第一行包含一个整数 $n$($1 \le n \le 100$),表示数组 $a$ 的长度。 第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$($-10^5 \le a_i \le 10^5$),表示初始数组 $a$。 第三行包含 $n$ 个整数 $l_1, l_2, \dots, l_n$($0 \le l_i \le 1$),其中 $l_i = 0$ 表示第 $i$ 个位置未锁定,$l_i = 1$ 表示第 $i$ 个位置已锁定。

输出格式

输出 $n$ 个整数,表示重新排列后的数组 $a$。对应的 $k$(即最大的 $j$ 使得 $p_j < 0$,若不存在则为 $0$)应尽可能小。对于每个锁定的位置,输出的值应与初始值相同。未锁定位置上的值应为初始未锁定位置上的值的某种排列。 如果有多种方案,输出任意一种即可。

说明/提示

在第一个测试用例中,你可以任意重新排列所有值,但无论如何排列,$k = 0$。例如,排列为 $[1, 2, 3]$ 时,$p = [1, 3, 6]$,没有 $j$ 满足 $p_j < 0$,因此 $k = 0$。 在第二个测试用例中,你不能重新排列任何元素,因此输出的数组应与初始数组完全相同。 在第三个测试用例中,输出数组的前缀和为 $p = [-8, -14, -13, -9, -5, 2, 0]$。最大的 $j$ 为 $5$,因此 $k = 5$。不存在 $k < 5$ 的排列。 在第四个测试用例中,$p = [-4, -4, -3, 3, 6]$。 在第五个测试用例中,$p = [-1, 3, 10, 2, 12, 11]$。 由 ChatGPT 4.1 翻译