배열 정리하기

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

요약
0부터 N^2-1까지의 순열이 담긴 N x N 배열이 주어질 때, 허용된 행 연산을 400000번 이하로 써서 정리된 배열로 바꾸는 방법을 출력한다.
난이도

어려움10점 중 9점

유형
구현, 그리디, 수학, 비트 연산
정답자
아직 제출이 없습니다

문제

준호는 크기가 N×NN \times N인 이차원 배열 AA를 가지고 있다. 준호가 가진 배열 AA는 다음과 같은 성질을 가진다:

  1. A_0,0A\_{0,0}과 A_N−1,N−1A\_{N-1, N-1}을 양 끝으로 가진다.
  2. 0≤a≤N2−10 \leq a \leq N^2-1를 만족하는 각 정수 aa가 정확히 한 번씩 배열의 원소로 등장한다.

준호는 배열을 정리하려고 한다. 정리된 배열이란 0≤i,j≤N−10 \leq i,j \leq N-1인 모든 정수 순서쌍 (i,j)(i,j)에 대해 A_i,j=i×N+jA\_{i,j} = i \times N+j를 만족하는 배열을 말한다.

배열을 정리하기 위해, 준호는 다음 중 원하는 연산을 골라 할 수 있다:

  • 11 xx yy: (0≤x≤N−1;0≤y≤N−2)(0 \leq x \leq N-1; 0 \leq y \leq N-2)을 만족하는 (x,y)(x, y)를 골라, A_x,yA\_{x,y}를 A_x,y+A_x,y+1A\_{x,y}+A\_{x,y+1}로 바꾼다.
  • 22 xx yy: (0≤x≤N−1;0≤y≤N−2)(0 \leq x \leq N-1; 0 \leq y \leq N-2)을 만족하는 (x,y)(x, y)를 골라, A_x,yA\_{x,y}를 A_x,y−A_x,y+1A\_{x,y}-A\_{x,y+1}로 바꾼다.
  • 33 xx yy: (0≤x≤N−1;1≤y≤N−1)(0 \leq x \leq N-1; 1 \leq y \leq N-1)을 만족하는 (x,y)(x, y)를 골라, A_x,yA\_{x,y}를 A_x,y+A_x,y−1A\_{x,y}+A\_{x,y-1}로 바꾼다.
  • 44 xx yy: (0≤x≤N−1;1≤y≤N−1)(0 \leq x \leq N-1; 1 \leq y \leq N-1)을 만족하는 (x,y)(x, y)를 골라, A_x,yA\_{x,y}를 A_x,y−A_x,y−1A\_{x,y}-A\_{x,y-1}로 바꾼다.
  • 55 xx yy: (0≤x≤N−2;0≤y≤N−1)(0 \leq x \leq N-2; 0 \leq y \leq N-1)을 만족하는 (x,y)(x, y)를 골라, A_x,yA\_{x,y}를 A_x,y⊕A_x+1,yA\_{x,y} \oplus A\_{x+1,y}로 바꾼다.
  • 66 xx yy: (1≤x≤N−1;0≤y≤N−1)(1 \leq x \leq N-1; 0 \leq y \leq N-1)을 만족하는 (x,y)(x, y)를 골라, A_x,yA\_{x,y}를 A_x,y⊕A_x−1,yA\_{x,y} \oplus A\_{x-1,y}로 바꾼다.

단, 연산 도중 배열의 원소가 −231-2^{31}보다 작아지거나, 231−12^{31}-1보다 커지면 안 된다.

이때 −231-2^{31}부터 231−12^{31}-1사이의 두 정수 aa와 bb에 대해 a⊕ba \oplus b 연산은 3232비트 부호 있는 정수 자료형에서의 XOR(exclusive OR)로 정의된다. 이에 대해선 노트를 참고하라.

준호가 제한을 만족하며 주어진 연산을 최대 400,000400\\,000회 하여 배열 AA를 정리된 배열로 바꾸는 방법을 구해보자. 가능한 방법이 여러 가지라면, 아무 방법이나 구해보자.

연산의 횟수를 최소화 할 필요는 없음에 유의하라.

입력

첫째 줄에 배열의 크기를 나타내는 NN이 주어진다.

둘째 줄부터 NN개의 줄에 걸쳐 i+2i+2번째 줄에 NN개의 정수 A_i,0,⋯ ,A_i,N−1A\_{i,0}, \cdots, A\_{i,N-1}이 공백으로 구분되어 주어진다.

출력

첫째 줄에 준호가 배열 AA를 정리하기 위한 연산 횟수 qq를 출력한다. (0≤q≤400,000)(0 \leq q \leq 400\\,000)

둘째 줄부터 qq개의 줄에 걸쳐 준호가 배열에 ii번째로 적용한 연산의 번호와 선택한 xx와 yy를 i+1i+1번째 줄에 공백으로 구분하여 출력한다.

모든 가능한 입력에 대해 주어진 제한 안에 AA를 정리할 수 있음을 보일 수 있다.

제한

  • 주어지는 모든 수는 정수이다.
  • 2≤N≤502 \leq N \leq 50
  • 0≤A_i,j≤N2−10 \le A\_{i,j} \le N^2-1 (0≤i,j≤N−1)(0 \le i,j \le N-1)
  • A_i,jA\_{i, j}는 모두 서로 다르다.

힌트

아래 내용은 3232비트 부호 있는 정수 자료형에서의 비트 표현 방법에 대해 설명합니다.

00과 양수는 그 값을 그대로 이진수로 표현합니다.

음수는 22의 보수로 변환하여 저장됩니다. 22의 보수 표현 방법은 다음과 같습니다:

  1. 양수의 이진수로 변환합니다.
  2. 11의 보수(모든 비트를 반전)로 변환합니다.
  3. 11을 더하여 22의 보수를 구합니다.

예를 들어 −5-5를 3232비트 22의 보수로 표현해 봅시다.

  1. 55는 00000000,00000000,00000000,0000010100000000 \\, 00000000 \\, 00000000 \\, 00000101입니다.
  2. 1의 보수를 구합니다. 11의 보수는 모든 비트를 반전시킨 값입니다: 11111111,11111111,11111111,1111101011111111 \\, 11111111 \\, 11111111 \\, 11111010
  3. 22의 보수를 구합니다. 11의 보수에 11을 더하면 22의 보수가 됩니다: 11111111,11111111,11111111,1111101111111111 \\, 11111111 \\, 11111111 \\, 11111011

따라서, −5-5는 22의 보수 방식으로 11111111,11111111,11111111,1111101111111111 \\, 11111111 \\, 11111111 \\, 11111011으로 표현됩니다.

아래 내용은 3232비트 부호 있는 정수 자료형에서의 XOR(exclusive OR)연산에 관해 설명합니다.

두 정수의 XOR 연산은 각 비트 자리에서 서로 다르면 11, 같으면 00이 되는 비트 연산입니다. 예를 들어

11111110,00000000,00000000,00000101⊕00001111,00000000,01111000,0000010111111110 \\, 00000000 \\, 00000000 \\, 00000101 \oplus 00001111 \\, 00000000 \\, 01111000 \\, 00000101을 계산하면

11110001,00000000,01111000,0000000011110001 \\, 00000000 \\, 01111000 \\, 00000000이 됩니다.

예제1

  1. 예제 1

    입력
    2
    0 1
    3 2
    
    예상 출력
    4
    1 0 0
    6 1 0
    2 0 0
    6 1 1