아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

로그 집합 (라지)

시간 제한5초메모리 제한512 MB

요약
모든 부분집합 합 빈도표에서 원래 정수 다중집합을 복원하고 동점인 경우 사전 순으로 가장 앞선 것을 출력합니다.
난이도

어려움10점 중 8점

유형
그리디, 정렬, 해시맵
정답자
아직 제출이 없습니다

문제

집합 S의 멱집합은 S의 모든 부분집합을 모은 집합이다. 공집합과 S 자신도 포함한다. 집합에서 멱집합을 만드는 일은 쉽지만, 이 문제는 반대 방향으로 간다.

정수로 이루어진 집합 S가 있다. 원소가 서로 다를 필요는 없다. S의 멱집합을 구한 다음, 멱집합의 각 원소, 즉 각 부분집합을 그 부분집합의 원소 합으로 바꾸어 새로운 집합 S'을 만들었다. 예를 들어 S = {-1, 1}이면 S의 멱집합은 {{}, {-1}, {1}, {-1, 1}}이므로 S' = {0, -1, 1, 0}이다. S'에는 같은 값이 여러 번 들어갈 수 있으므로, S의 원소가 N개면 S'의 원소는 항상 정확히 2N2^N개다.

S'에 나타나는 값과 각 값의 등장 횟수가 주어진다. 원래 집합 S를 복원하라. S는 반드시 존재한다. 같은 S'을 만드는 S가 여럿이면 원래 집합은 그중 가장 앞서는 것이다. 원소 개수가 같은 두 집합 S1과 S2 중 어느 쪽이 앞서는지는 이렇게 정한다. 각 집합을 비내림차순으로 정렬한 뒤 두 집합이 처음으로 달라지는 위치를 찾는다. 그 위치의 값이 더 작은 쪽이 앞선다.

입력

첫 줄에 테스트 케이스의 수 T가 주어진다. 이어서 T개의 테스트 케이스가 주어진다. 각 테스트 케이스는 세 줄로 이루어진다. 첫 줄에는 정수 P가 주어진다. 둘째 줄에는 S'에 나타나는 서로 다른 값 E1,E2,…,EPE_1, E_2, \dots, E_P가 오름차순으로 주어진다. 셋째 줄에는 각 값의 등장 횟수 F1,F2,…,FPF_1, F_2, \dots, F_P가 주어진다. 즉 값 EiE_i는 S'에 FiF_i번 나타난다.

제한

  • 1≤T≤1001 \le T \le 100
  • 1≤P≤100001 \le P \le 10000
  • Fi≥1F_i \ge 1
  • S의 원소 개수는 1개 이상 60개 이하다.
  • −1010≤Ei≤1010-10^{10} \le E_i \le 10^{10}
  • F1+F2+⋯+FP=2NF_1 + F_2 + \dots + F_P = 2^N이다. 여기서 N은 S의 원소 개수다.

출력

각 테스트 케이스마다 한 줄에 "Case #x: "를 출력하고, 그 뒤에 원래 집합 S의 원소를 비내림차순으로 공백 하나씩 두고 출력한다. x는 1부터 시작하는 테스트 케이스 번호다. S'처럼 값과 횟수를 두 줄로 나누지 말고 S의 원소를 그대로 나열한다.

노트

S'만으로 S가 하나로 정해지지 않을 때가 있다. 예를 들어 {-2, 1, 1}과 {2, -1, -1}은 같은 S'을 만든다. 이때 답은 더 앞서는 {-2, 1, 1}이다.

예제1

  1. 예제 1

    입력
    5
    8
    0 1 2 3 4 5 6 7
    1 1 1 1 1 1 1 1
    4
    0 1 2 3
    1 3 3 1
    4
    0 1 3 4
    4 4 4 4
    3
    -1 0 1
    1 2 1
    5
    -2 -1 0 1 2
    1 2 2 2 1
    
    예상 출력
    Case #1: 1 2 4
    Case #2: 1 1 1
    Case #3: 0 0 1 3
    Case #4: -1 1
    Case #5: -2 1 1