배열 정리하기
시간 제한1초메모리 제한1024 MB
0부터 N^2-1까지의 순열이 담긴 N x N 배열이 주어질 때, 허용된 행 연산을 400000번 이하로 써서 정리된 배열로 바꾸는 방법을 출력한다.
문제
준호는 크기가 인 이차원 배열 를 가지고 있다. 준호가 가진 배열 는 다음과 같은 성질을 가진다:
- 과 을 양 끝으로 가진다.
- 를 만족하는 각 정수 가 정확히 한 번씩 배열의 원소로 등장한다.
준호는 배열을 정리하려고 한다. 정리된 배열이란 인 모든 정수 순서쌍 에 대해 를 만족하는 배열을 말한다.
배열을 정리하기 위해, 준호는 다음 중 원하는 연산을 골라 할 수 있다:
- : 을 만족하는 를 골라, 를 로 바꾼다.
- : 을 만족하는 를 골라, 를 로 바꾼다.
- : 을 만족하는 를 골라, 를 로 바꾼다.
- : 을 만족하는 를 골라, 를 로 바꾼다.
- : 을 만족하는 를 골라, 를 로 바꾼다.
- : 을 만족하는 를 골라, 를 로 바꾼다.
단, 연산 도중 배열의 원소가 보다 작아지거나, 보다 커지면 안 된다.
이때 부터 사이의 두 정수 와 에 대해 연산은 비트 부호 있는 정수 자료형에서의 XOR(exclusive OR)로 정의된다. 이에 대해선 노트를 참고하라.
준호가 제한을 만족하며 주어진 연산을 최대 회 하여 배열 를 정리된 배열로 바꾸는 방법을 구해보자. 가능한 방법이 여러 가지라면, 아무 방법이나 구해보자.
연산의 횟수를 최소화 할 필요는 없음에 유의하라.
입력
첫째 줄에 배열의 크기를 나타내는 이 주어진다.
둘째 줄부터 개의 줄에 걸쳐 번째 줄에 개의 정수 이 공백으로 구분되어 주어진다.
출력
첫째 줄에 준호가 배열 를 정리하기 위한 연산 횟수 를 출력한다.
둘째 줄부터 개의 줄에 걸쳐 준호가 배열에 번째로 적용한 연산의 번호와 선택한 와 를 번째 줄에 공백으로 구분하여 출력한다.
모든 가능한 입력에 대해 주어진 제한 안에 를 정리할 수 있음을 보일 수 있다.
제한
- 주어지는 모든 수는 정수이다.
- 는 모두 서로 다르다.
힌트
아래 내용은 비트 부호 있는 정수 자료형에서의 비트 표현 방법에 대해 설명합니다.
과 양수는 그 값을 그대로 이진수로 표현합니다.
음수는 의 보수로 변환하여 저장됩니다. 의 보수 표현 방법은 다음과 같습니다:
- 양수의 이진수로 변환합니다.
- 의 보수(모든 비트를 반전)로 변환합니다.
- 을 더하여 의 보수를 구합니다.
예를 들어 를 비트 의 보수로 표현해 봅시다.
- 는 입니다.
- 1의 보수를 구합니다. 의 보수는 모든 비트를 반전시킨 값입니다:
- 의 보수를 구합니다. 의 보수에 을 더하면 의 보수가 됩니다:
따라서, 는 의 보수 방식으로 으로 표현됩니다.
아래 내용은 비트 부호 있는 정수 자료형에서의 XOR(exclusive OR)연산에 관해 설명합니다.
두 정수의 XOR 연산은 각 비트 자리에서 서로 다르면 , 같으면 이 되는 비트 연산입니다. 예를 들어
을 계산하면
이 됩니다.