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

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

합 근원 판별

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

요약
각 질의 합 X에 대해, 비밀 값이 가장 작은 공개 값보다 작아야 한다는 조건에서 X를 만드는 모든 유효한 부분집합에 반드시 포함되는 공개 보유자를 찾는다.
난이도

보통10점 중 7점

유형
동적 계획법, 해시맵, 구현, 수학
정답자
아직 제출이 없습니다

문제

JAG 회원들이 정수 게임을 시작했다. 게임에는 N+M+1N + M + 1명의 참가자가 있다. 공개 숫자 보유자 NN명, 비밀 숫자 보유자 MM명, 그리고 답변자 한 명, 즉 당신이다.

준비 단계에서 정수 KK가 N+M+1N+M+1명의 참가자 모두에게 주어진다. N+MN + M명의 숫자 보유자는 다음 제약 아래에서 각자 정수를 하나씩 고른다.

  • 각 보유자가 소유하는 정수는 양의 정수이다.
  • 모든 정수의 합은 KK이다.
  • 비밀 숫자 보유자가 소유한 정수는 모두 공개 숫자 보유자가 소유한 어떤 정수보다도 작다.

선택이 끝나면 NN명의 공개 숫자 보유자는 자신의 정수 O1,…,ONO_{1}, \dots, O_{N}을 답변자에게 공개하지만, 비밀 숫자 보유자는 공개하지 않는다.

게임은 QQ라운드로 진행된다. 각 라운드가 시작될 때 MM명의 비밀 숫자 보유자는 위 제약 아래에서 자신의 숫자를 바꿀 수 있지만, 공개 숫자 보유자는 바꿀 수 없다. 그런 다음 N+MN + M명의 숫자 보유자가 그중 일부를 임의로 선택하고, 선택된 보유자가 소유한 정수의 합 XX를 계산하여 답변자에게 알려 준다. 각 라운드에서 답변자는 정보 KK, XX, O1,…,ONO_{1}, \dots, O_{N}로부터 반드시 선택된 공개 숫자 보유자를 알아내려고 한다. 답변자는 답에 실제로 선택된 공개 숫자 보유자 하나당 점수를 얻는다. 반면, 답에 선택되지 않은 보유자가 하나라도 포함되면 그 라운드에서 얻은 점수를 모두 잃는다. 따라서 답변자인 당신은 반드시 선택되었다고 확신할 수 있는 공개 숫자 보유자만 답해야 한다.

이 문제에서 당신의 과제는 각 라운드마다 합에 반드시 필요하다고 확신할 수 있는 공개 숫자 보유자를 모두 판별하는 프로그램을 작성하는 것이다.

입력

입력은 하나의 테스트 케이스로 이루어지며 형식은 다음과 같다.

$N$ $M$ $K$ $Q$ $O_{1}$ $\cdots$ $O_{N}$ $X_{1}$ $\cdots$ $X_{Q}$

첫 줄에 네 정수 NN, MM, KK, QQ가 주어진다. NN과 MM은 각각 공개 숫자 보유자와 비밀 숫자 보유자의 수이다 (1≤N,0≤M,N+M≤40)(1 \le N, 0 \le M, N + M \le 40). KK는 정수이다 (1≤K≤200,000)(1 \le K \le 200{,}000). QQ는 게임의 라운드 수이다 (1≤Q≤10,000)(1 \le Q \le 10{,}000).

둘째 줄에 NN개의 정수 O1,⋯ ,ONO_{1}, \cdots, O_{N}이 주어지며, ii번째 공개 숫자 보유자는 OiO_{i}를 소유한다 (1≤O1≤⋯≤ON≤K)(1 \le O_{1} \le \dots \le O_{N} \le K).

셋째 줄에 QQ개의 정수 X1,⋯ ,XQX_{1}, \cdots, X_{Q}가 주어진다 (0≤Xi≤K)(0 \le X_{i} \le K). XiX_{i}는 ii번째 라운드에서 선택된 보유자가 소유한 정수의 합이다.

XiX_{i}를 구성하는 방법이 적어도 하나 존재함이 보장된다. 다시 말해, 비밀 숫자 보유자가 소유한 정수를 나타내는 정수 수열 S1,…,SMS_{1}, \dots, S_{M}이 다음 조건을 만족하는 경우가 적어도 하나 존재한다고 가정할 수 있다.

  • 1≤j≤M1 \le j \le M에 대해 0<Sj<O10 < S_{j} < O_{1}이다. O1=min⁡1≤k≤NOkO_{1} = \min_{1 \le k \le N} O_{k}이다.
  • ∑j=1NOj+∑k=1MSk=K\sum_{j=1}^{N} O_{j} + \sum_{k=1}^{M} S_{k} = K이다.
  • ∑j∈UOj+∑k∈VSk=Xi\sum_{j \in U} O_{j} + \sum_{k \in V} S_{k} = X_{i}를 만족하는 부분집합 U⊆{1,…,N}U \subseteq \{1, \dots, N\}와 V⊆{1,…,M}V \subseteq \{1, \dots, M\}가 적어도 하나 존재한다.

출력

각 합 XiX_{i}에 대해, XiX_{i}를 구성하는 데 반드시 필요한 공개 숫자 보유자의 번호를 출력한다. 각 합에 대한 출력은 한 줄에 오름차순으로, 공백 하나로 구분하여 출력한다. XiX_{i}에 반드시 사용되는 정수가 있는 공개 숫자 보유자가 없으면 −1-1을 한 줄에 출력한다.

예제5

  1. 예제 1

    입력
    2 2 23 2
    7 10
    9 10
    
    예상 출력
    1
    -1
    
  2. 예제 2

    입력
    1 1 100 3
    51
    49 51 100
    
    예상 출력
    -1
    1
    1
    
  3. 예제 3

    입력
    2 1 58152 4
    575 57500
    575 57577 77 0
    
    예상 출력
    1
    2
    -1
    -1
    
  4. 예제 4

    입력
    3 2 1500 1
    99 300 1000
    99
    
    예상 출력
    1
    
  5. 예제 5

    입력
    3 2 20 19
    3 3 11
    1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20
    
    예상 출력
    -1
    -1
    -1
    -1
    -1
    -1
    1 2
    1 2
    1 2
    3
    3
    3
    3
    3
    3
    3
    1 2 3
    1 2 3
    1 2 3