아제르바이잔은 카펫으로 유명하다. 카펫 디자이너인 당신은 꺾인선을 그려 새로운 무늬를 만들려고 한다. 꺾인선은 평면 위의 t+1개 점 p0,…,pt로 정의되는 t개 선분의 수열이다. 각 0≤j≤t−1에 대해 pj와 pj+1을 잇는 선분이 있다.
평면에는 n개의 점이 표시되어 있고 점 i (1≤i≤n)의 좌표는 (x[i],y[i])이다. 어떤 두 점도 같은 x좌표나 같은 y좌표를 갖지 않는다.
다음을 모두 만족하는 점의 수열 (sx[0],sy[0]),…,(sx[k],sy[k])을 찾아야 한다.
- (0,0)에서 시작한다. 즉, sx[0]=0, sy[0]=0이다.
- 모든 표시된 점을 지난다. 표시된 점이 선분의 끝점일 필요는 없다.
- 모든 선분은 수평 또는 수직이다. 즉, 연속한 두 점은 x좌표나 y좌표 중 하나가 같다.
꺾인선은 자기 자신과 교차하거나 겹칠 수 있다.
원 대회에서는 이 문제가 출력 파일 제출형 부분 점수 문제였다. Reporch에서는 공식 입력 하나를 읽고 공식 출력 형식의 꺾인선을 출력하는 C++17 프로그램을 제출한다. 공식 입력, 출력 checker, 점수 기준은 바꾸지 않았다. 올바른 꺾인선의 점수는 선분 수에 따라 정해진다.
입력 형식
- 첫째 줄: n
- 이어지는 n개 줄의 i번째 줄: x[i]y[i]
출력 형식
- 첫째 줄: k
- 이어지는 k개 줄의 j번째 줄: sx[j]sy[j] (1≤j≤k)
출력에는 시작점 (sx[0],sy[0])=(0,0)을 쓰지 않는다. 모든 좌표는 정수여야 한다.
예제
입력:
4
2 1
3 3
4 4
5 2
가능한 출력:
6
2 0
2 3
5 3
5 2
4 2
4 4

이 예제는 실제 채점 입력에는 포함되지 않는다.
제한
- 1≤n≤100000
- 1≤x[i],y[i]≤109
- 모든 x[i], y[i]는 정수이다.
- i1=i2이면 x[i1]=x[i2]이고 y[i1]=y[i2]이다.
- −2⋅109≤sx[j],sy[j]≤2⋅109
- 출력 크기는 15MB를 넘을 수 없다.
채점
각 테스트 케이스에서 최대 10점을 얻는다. 출력한 꺾인선이 조건을 만족하지 않으면 0점이다. 올바른 꺾인선이 k개 선분으로 이루어졌다면 테스트별 감소 수열 c1,…,c10에 따라 다음 점수를 얻는다.
- k=ci이면 i점
- ci+1<k<ci이면 i+ci−ci+1ci−k점
- k>c1이면 0점
- k<c10이면 10점
| 테스트 | 01 | 02 | 03 | 04 | 05 | 06 | 07-10 |
|---|
| n | 20 | 600 | 5000 | 50000 | 72018 | 91891 | 100000 |
| c1 | 50 | 1200 | 10000 | 100000 | 144036 | 183782 | 200000 |
| c2 | 45 | 937 | 7607 | 75336 | 108430 | 138292 | 150475 |
| c3 | 40 | 674 | 5213 | 50671 | 72824 | 92801 | 100949 |
| c4 | 37 | 651 | 5125 | 50359 | 72446 | 92371 | 100500 |
| c5 | 35 | 640 | 5081 | 50203 | 72257 | 92156 | 100275 |
| c6 | 33 | 628 | 5037 | 50047 | 72067 | 91941 | 100050 |
| c7 | 28 | 616 | 5020 | 50025 | 72044 | 91918 | 100027 |
| c8 | 26 | 610 | 5012 | 50014 | 72033 | 91906 | 100015 |
| c9 | 25 | 607 | 5008 | 50009 | 72027 | 91900 | 100009 |
| c10 | 23 | 603 | 5003 | 50003 | 72021 | 91894 | 100003 |
시각화 도구
공식 첨부 파일의 vis.py로 입력이나 출력을 시각화할 수 있다. 출력은 처음 1000개 선분까지만 표시된다.
python vis.py [input file]
python vis.py [input file] --solution [output file]