#include #include #include #include using namespace std; void solve() { int N; cin >> N; // 元のインデックスを保持するためにペアの配列を作成 // {値, 元の場所(0-indexed)} vector> A(N); for (int i = 0; i < N; ++i) { cin >> A[i].first; A[i].second = i; } vector B(N); for (int i = 0; i < N; ++i) { cin >> B[i]; } // Aを昇順にソート(小さいカードから食べる候補にする) sort(A.begin(), A.end()); // Bの累積和を計算 vector sum_B(N + 1, 0); for (int i = 0; i < N; ++i) { sum_B[i + 1] = sum_B[i] + B[i]; } // A(ソート済)の累積和を計算 vector sum_A_sorted(N + 1, 0); for (int i = 0; i < N; ++i) { sum_A_sorted[i + 1] = sum_A_sorted[i] + A[i].first; } long long max_gain = -4e18; // 十分小さな値で初期化 int best_k = 0; // k枚食べる時の「得点の増分」を計算 // 増分 = (Bの最初のk枚の和) - (Aの小さい方からk枚の和) for (int k = 0; k <= N; ++k) { long long current_gain = sum_B[k] - sum_A_sorted[k]; if (current_gain > max_gain) { max_gain = current_gain; best_k = k; } } // 文字列の構築 string S(N, '0'); // Aのソート順で先頭best_k個を「食べる(1)」に設定 for (int i = 0; i < best_k; ++i) { S[A[i].second] = '1'; } cout << S << "\n"; } int main() { // 入出力の高速化 ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { solve(); } return 0; }