Testify

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

요약
직선 배치의 각 구역에 표시를 남기고, 그 표시만 보고 6n번 이내의 이동으로 인접 구역 사이를 탐색하는 두 단계 인터랙티브 문제.
난이도

어려움10점 중 9점

유형
그래프, 구현, 그리디, 수학
정답자
아직 제출이 없습니다

문제

Darkest night, I'll confront you here....

이 문제는 투 스텝 인터랙티브 문제입니다.

히카리와 타이리츠는 협동 게임을 하여 그들의 우정을 증명하고자 한다.

게임은 nn개의 직선이 있는 평면에서 진행된다. 어떠한 두 직선도 평행하지 않으며, 어떠한 세 직선도 한 점에서 만나지 않으며, 모든 직선은 xx축, 혹은 yy축과 평행하지 않는다.

어떠한 위치 (x_0,y_0)(x\_0, y\_0) 이 직선 y=ax+by = ax + b 위에 있다는 것은, y_0>ax_0+by\_0>ax\_0+b를 만족한다는 것이다. 반대로, 어떠한 위치 (x_0,y_0)(x\_0,y\_0) 이 직선 y=ax+by = ax + b 아래에 있다는 것은, y_0\<ax_0+by\_0\<ax\_0+b를 만족한다는 것이다. 이에 따라, 평면 상에서 직선에 속하지 않는 모든 점들은 각 직선의 위에 있거나 아래에 있다.

어떠한 두 점 p,qp, q 가 nn 개의 직선에 대해서 항상 같이 위에 있거나 같이 아래에 있다면, 두 점 p,qp, q 는 같은 구역에 속한다고 한다. 상술한 문제 조건에 따라서, 평면은 정확히 n(n+1)2+1\frac{n(n+1)}{2}+1 개의 구역들로 분할됨을 증명할 수 있다.

두 서로 다른 구역 e,fe, f 가 인접하다는 것은, e,fe, f 에 속하는 임의의 두 점 p(e),p(f)p(e), p(f) 에 대해서 p(e)p(e) 와 p(f)p(f) 사이를 정확히 하나의 직선만을 가로질러 이동할 수 있음을 뜻한다. 서로 다른 인접한 쌍은 정확히 n2n^2 개임을 증명할 수 있다.

게임은 히카리가 각 구역들에 특정한 표시를 남긴 후, 타이리츠가 이 표시를 통해서 구역 간을 이동하는 식으로 이루어진다.

히카리의 차례를 먼저 설명한다. 히카리가 각 구역들에 표시를 남기는 것은 다음과 같은 인터랙션을 통해 이루어진다.

  1. 히카리는 1,0001\\,000 이하의 양의 정수 MM을 선언한다.

  2. 채점 인터랙터는 다음과 같은 정보들을 히카리에게 표준 입력으로 전달한다:

    1. 양의 정수 nn.
    2. 평면 상의 nn 개의 직선의 정보.
    3. 평면 상의 모든 n(n+1)2+1\frac{n(n+1)}{2}+1 개의 구역 각각에 대해, 길이 nn 의 이진 문자열이 주어진다. 각 구역은 주어진 순서대로 11 에서 n(n+1)2+1\frac{n(n+1)}{2}+1 까지의 서로 다른 번호가 부여된다. ii 번 구역을 나타내는 문자열의 jj 번 문자는, ii번 구역이 jj번 직선의 아래에 있다면 00이고, 위에 있다면 11 이다.
    4. 총 n2n^2개의 인접한 두 구역의 번호 쌍이 주어진다.
  3. 히카리는 각 구역마다 두 개의 정수를 표시해야 한다. 첫 번째 정수는 11부터 MM 사이의 정수여야 하며, 두 번째 정수는 00부터 nn 사이의 정수여야 한다.

이제 타이리츠의 차례를 설명한다. 타이리츠의 목표는 평면의 어떤 구역에서 게임을 시작하여, 다른 어떤 구역으로 이동해야 한다. 일련의 이동 과정은 다음과 같은 인터랙션을 통해 이루어진다.

  1. 채점 인터랙터는 첫 줄에 히카리가 받은 직선의 개수 nn 을 표준 입력으로 전달한다.

  2. 채점 인터랙터는 다음 줄에 총 44 개의 정수를 타이리츠에게 표준 입력으로 전달한다.

    1. 첫 번째와 두 번째 정수는, 타이리츠가 현재 위치한 구역에 히카리가 표시한 두 정수 쌍이다. 두 정수의 순서는 히카리가 부여한 그대로이다.
    2. 세 번째와 네 번째 정수는, 타이리츠가 도착해야 하는 구역에 히카리가 표시한 두 정수 쌍이다. 두 정수의 순서는 히카리가 부여한 그대로이다.
  3. 타이리츠는 자신이 있는 구역과 인접한 구역으로 이동할 수 있다. 이때, 어떤 두 구역이 인접하다는 것은 두 구역이 공유하는 변이 존재한다는 것이다. 타이리츠가 자신과 인접한 구역으로 이동하는 것은 다음과 같은 절차를 6n6n 번 반복하여 이루어진다.

    1. 채점 인터랙터는 길이 MM의 이진수열을 타이리츠에게 표준 입력으로 전달한다. 해당 이진수열의 ii번째 원소가 00이라면 직전에 방문하지 않은 구역들 중 ii를 첫번째 정수로 가지는 인접한 구역이 없다는 것이고, 11이라면 있다는 것이다.

    2. 타이리츠는 둘 중 하나의 행동을 할 수 있다:

      1. 어떤 x(1≤x≤M)x(1\le x\le M)를 골라서, 자신과 인접하고 직전에 방문하지 않았으며 첫 번째 정수가 xx인 구역으로 이동한다. 만약 직전에 방문하지 않았으며 첫 번째 정수가 xx인 구역이 여러 개라면, 그중 임의의 한 구역으로 이동한다.
      2. 이전에 방문했던 구역으로 돌아간다.
    3. 채점 인터랙터는 타이리츠가 도착지에 도달했는지 여부를 타이리츠에게 알려준다. 타이리츠가 도착지에 도달하였다면, 프로그램은 즉시 종료하여야 한다. 프로그램이 종료되면 게임은 성공한다. 도달하지 못 했고, 이동 횟수가 6n6n 번 미만일 경우, 다시 이동을 시작한다.

  4. 타이리츠가 6n6n 번의 이동 후에도 도착지에 도달하지 못 했다면 게임은 실패한다.

타이리츠의 차례를 진행할 때, 타이리츠가 도착하고 싶은 구역과 첫 번째 정수와 두 번째 정수가 동일한 어떤 구역에 도달했다고 하더라도, 해당 구역이 타이리츠가 도착하고 싶은 구역은 아닐 수도 있음에 유의하라.

게임을 성공할 수 있게, 히카리와 타이리츠의 전략을 수행하는 프로그램을 작성하여라. 히카리가 처음에 선언하는 정수 MM이 작으면 작을수록 더욱 큰 점수를 얻을 수 있다.

제한

  • 3≤n≤1003\le n\le 100
  • T=0T = 0인 경우 각 직선에 대해 −1,000≤x,y,z,w≤1,000-1\\,000 \le x,y,z,w \le 1\\,000

힌트

출력 버퍼를 비우는 방법은 다음과 같다.

  • C: fflush(stdout)
  • C++: std::cout << std::flush
  • Java: System.out.flush()
  • Python: sys.stdout.flush()

이외의 언어에 대해서는 언어별 명세를 참고해야 한다.

예제2

  1. 예제 1

    입력
    0
    
    3
    -6 0 0 6
    -6 0 6 -2
    0 6 6 -2
    000
    100
    010
    001
    110
    011
    111
    1 2
    1 3
    1 4
    2 5
    3 5
    3 6
    4 6
    5 7
    6 7
    
    예상 출력
    
    7
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    1 0
    2 1
    3 2
    4 3
    5 3
    6 2
    7 3
    
  2. 예제 2

    입력
    1
    3
    3 2 4 3
    1000110
    
    0
    0101000
    
    1
    
    예상 출력
    
    
    
    
    1
    
    
    4