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

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

불 트리 속이기

면접 대비

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

요약
토너먼트 형태의 불리언 트리에서 바꿀 수 있는 AND/OR 게이트를 최소한으로 뒤집어 루트 값이 V가 되도록 하거나, 불가능하면 보고한다.
난이도

보통10점 중 5점

유형
트리, 동적 계획법
정답자
아직 제출이 없습니다

문제

불 트리는 이진 트리의 한 종류다. 이 트리는 1번부터 MM번까지 번호가 붙은 홀수 개의 노드로 이루어진다. 1번부터 (M−1)/2(M-1)/2번까지는 내부 노드이고, ii번 노드는 2i2i번 노드와 2i+12i+1번 노드를 자식으로 갖는다. (M+1)/2(M+1)/2번부터 MM번까지는 리프 노드다.

노드의 값은 다음과 같이 정해진다. 리프 노드는 0 또는 1의 값을 갖는다. 내부 노드는 AND 게이트이거나 OR 게이트다. 아래 그림이 불 트리의 예다.

불 트리의 예

서브트리의 값도 자연스럽게 정의된다. 서브트리의 루트가 리프 노드라면 그 리프 노드의 값이 서브트리의 값이다. 서브트리의 루트가 내부 노드라면 그 노드의 게이트로 왼쪽 서브트리의 값과 오른쪽 서브트리의 값을 결합한 결과가 서브트리의 값이다. 예를 들어 위 그림에서 2번 노드를 루트로 하는 서브트리의 값은 다음과 같다.

Val[2] = Val[4] AND Val[5] = (Val[8] OR Val[9]) AND 1 = (0 OR 1) AND 1 = 1

우리는 전체 트리의 값, 즉 Val[1]이 VV가 되기를 원한다. VV는 입력으로 주어지는 0 또는 1이다. 지금 트리의 값이 VV와 다를 수 있으므로 내부 노드 몇 개의 게이트를 바꾸는 것이 허용된다. 즉 AND 게이트를 OR 게이트로, OR 게이트를 AND 게이트로 바꿀 수 있다. 위 그림에서 파란색으로 표시된 노드가 바꿀 수 있는 노드다.

불 트리와 바꿀 수 있는 내부 노드가 주어질 때, 전체 트리의 값을 VV로 만들기 위해 바꿔야 하는 게이트의 최소 개수를 구하라.

입력

첫 줄에 테스트 케이스의 개수 TT (1≤T≤201 \le T \le 20)가 주어진다.

각 테스트 케이스는 다음과 같이 구성된다.

  • 첫 줄에 MM과 VV가 주어진다. MM은 불 트리의 노드 개수이고 홀수다. VV는 전체 트리의 값으로 만들고 싶은 값이다. (1≤M≤100001 \le M \le 10000, VV는 0 또는 1)
  • 다음 (M−1)/2(M-1)/2개의 줄에는 내부 노드의 정보 aia_i와 bib_i가 1번 노드부터 차례로 주어진다. aia_i는 그 노드의 게이트를 뜻하며 0은 OR 게이트, 1은 AND 게이트다. bib_i는 그 노드의 게이트를 바꿀 수 있는지를 뜻하며 1이면 바꿀 수 있고 0이면 바꿀 수 없다.
  • 다음 (M+1)/2(M+1)/2개의 줄에는 리프 노드의 값 aia_i가 (M+1)/2(M+1)/2번 노드부터 차례로 주어진다.

출력

각 테스트 케이스마다 Case #c: x 형식으로 한 줄에 답을 출력한다. cc는 1부터 매기는 테스트 케이스 번호다. xx는 전체 트리의 값을 VV로 만들기 위해 바꿔야 하는 게이트의 최소 개수다. 게이트를 어떻게 바꿔도 전체 트리의 값을 VV로 만들 수 없다면 xx 자리에 IMPOSSIBLE을 출력한다.

예제6

  1. 예제 1

    입력
    2
    9 1
    1 0
    1 1
    1 1
    0 0
    1
    0
    1
    0
    1
    5 0
    1 1
    0 0
    1
    1
    0
    
    예상 출력
    Case #1: 1
    Case #2: IMPOSSIBLE
    
  2. 예제 2

    입력
    3
    1 1
    1
    1 0
    1
    1 0
    0
    
    예상 출력
    Case #1: 0
    Case #2: IMPOSSIBLE
    Case #3: 0
    
  3. 예제 3

    입력
    1
    7 1
    0 0
    1 0
    0 0
    1
    0
    0
    1
    
    예상 출력
    Case #1: 0
    
  4. 예제 4

    입력
    1
    7 0
    0 0
    0 0
    0 0
    1
    0
    0
    0
    
    예상 출력
    Case #1: IMPOSSIBLE
    
  5. 예제 5

    입력
    20
    5 0
    1 0
    0 1
    1
    1
    0
    5 1
    0 0
    1 1
    0
    0
    1
    13 1
    1 1
    0 0
    1 0
    1 1
    0 1
    0 0
    0
    0
    1
    1
    1
    0
    0
    7 1
    1 1
    0 0
    0 0
    0
    1
    1
    0
    9 1
    1 1
    1 1
    1 0
    0 1
    0
    1
    0
    0
    1
    5 0
    1 1
    1 1
    0
    1
    0
    15 1
    0 0
    0 0
    0 1
    1 1
    0 0
    0 1
    0 0
    0
    0
    1
    1
    1
    1
    1
    1
    5 0
    1 0
    0 0
    1
    0
    0
    9 0
    1 0
    1 1
    0 1
    0 0
    1
    0
    1
    0
    1
    15 0
    1 0
    0 0
    0 0
    0 1
    1 0
    1 1
    0 0
    0
    1
    1
    1
    0
    1
    1
    0
    3 1
    0 0
    1
    0
    7 0
    1 1
    0 0
    0 0
    0
    0
    1
    0
    3 1
    0 1
    1
    0
    11 0
    0 0
    1 0
    1 1
    1 0
    0 0
    1
    1
    1
    0
    1
    1
    15 1
    0 0
    1 1
    0 0
    1 0
    0 0
    0 0
    1 0
    1
    0
    0
    0
    0
    0
    0
    0
    11 0
    0 1
    1 0
    0 0
    1 0
    1 0
    1
    1
    0
    1
    0
    1
    11 0
    1 0
    1 1
    0 1
    0 1
    0 0
    0
    1
    1
    1
    0
    0
    5 0
    1 0
    0 0
    0
    0
    1
    3 1
    0 1
    1
    1
    15 1
    0 1
    0 0
    1 1
    0 1
    1 0
    1 0
    1 0
    1
    0
    1
    1
    1
    0
    1
    0
    
    예상 출력
    Case #1: 1
    Case #2: 1
    Case #3: 1
    Case #4: 0
    Case #5: 2
    Case #6: 0
    Case #7: 0
    Case #8: 0
    Case #9: 1
    Case #10: IMPOSSIBLE
    Case #11: 0
    Case #12: 0
    Case #13: 0
    Case #14: IMPOSSIBLE
    Case #15: IMPOSSIBLE
    Case #16: 1
    Case #17: 0
    Case #18: 0
    Case #19: 0
    Case #20: 0
    
  6. 예제 6

    입력
    1
    3 1
    1 1
    1
    0
    
    예상 출력
    Case #1: 1