| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1 초 | 1024 MB | 341 | 88 | 84 | 26.667% |
KOI사에서는 알고리즘 대회를 홍보하기 위한 새로운 이벤트를 만들었다! 이벤트에 참가하기 위해서는 KOI사만이 알고 있는 비밀 수열 $S$가 팰린드롬인지 판별해야 한다.
수열을 뒤집었을 때의 결과가 원래의 수열과 같아지는 수열을 팰린드롬이라고 한다. 즉, 길이가 $N$인 수열 $S$가 팰린드롬이라는 것은, 모든 0ドル ≤ i ≤ N - 1$에 대해 $S[i] = S[N - 1 - i]$이라는 것과 같다. 예를 들어, $[1, 2, 3, 2, 1],ドル $[1, 2, 2, 1]$은 팰린드롬이지만 $[1, 2, 3, 1],ドル $[1, 2, 2]$는 팰린드롬이 아니다.
당신은 처음에 비밀 수열 $S$의 길이 $N$을 알고 있다. 또한, $S$는 1ドル$ 이상 5ドル,円 000$ 이하의 정수로 이루어진 수열임도 알고 있다. 이벤트 참가자들을 돕기 위해, KOI사는 특별 제작한 두 가지 기계를 제공한다.
count_pair 기계에는 서로 다른 세 개의 수 $x,ドル $y,ドル $z$를 입력해야 한다. 이때 기계는 $S[x],ドル $S[y],ドル $S[z]$ 중 같은 쌍의 개수를 반환한다. 예를 들어, $S[x] = S[y] = S[z]$ 일 경우 기계는 3을 반환한다.find_character 기계에는 하나의 정수 $x$와 정수들의 목록 $Y$를 입력해야 한다. 이때 기계는 $S[x] = S[y]$인 $y$가 목록 $Y$에 있다면 1ドル,ドル 없으면 0ドル$을 반환한다.find_character 기계에 입력한 $Y$의 크기의 합은 $N$ 이하여야 한다.당신은 적은 횟수로 기계를 사용하여 비밀 수열 $S$가 팰린드롬인지 판별해야 한다.
다음 함수를 구현해야 한다:
int guess_palindromicity(int N)
프로그램은 다음 함수를 호출할 수 있다:
int count_pair(int x, int y, int z)
int find_character(int x, vector<int> Y)
guess_palindromicity 호출에서, 이 함수를 $N$번을 초과하여 호출할 수 없다.guess_palindromicity 호출에서, 호출하는 이 함수의 $Y$의 크기의 합이 $N$ 이하이어야 한다.제출하는 소스 코드의 어느 부분에서도 입출력 함수를 실행해서는 안 된다.
이 문제에서 그레이더는 적응적이지 않다(NOT adaptive). 이것은 $S$가 그레이더의 수행 초기에 고정되어 쿼리에 따라 변하지 않음을 의미한다.
각각의 guess_palindromicity 호출마다 아래와 같은 방식으로 점수를 매긴다. 당신의 제출이 받는 점수는 모든 테스트 케이스의 guess_palindromicity 호출에서 얻은 점수의 최솟값이다.
각 guess_palindromicity 호출에서, count_pair 함수의 호출 횟수를 $A,ドル find_character 함수의 호출 횟수를 $B$라고 하자.
프로그램이 정상적으로 종료하지 않거나, guess_palindromicity가 반환한 값이 잘못된 경우 0ドル$점이 부여된다. guess_palindromicity가 반환한 값이 맞았을 때 부여되는 점수는 아래의 표와 같다.
| 조건 | 점수 |
|---|---|
| $A ≤ 2N,ドル 2ドル ≤ B ≤ N$ | 15ドル$ |
| $N < A ≤ 2N,ドル $B ≤ 1$ | 50ドル$ |
| $\lfloor \frac{N}{2} \rfloor + 2 < A ≤ N,ドル $B ≤ 1$ | 70ドル$ |
| $A = \lfloor \frac{N}{2} \rfloor + 2,ドル $B ≤ 1$ | 90ドル$ |
| $A ≤ \lfloor \frac{N}{2} \rfloor + 1,ドル $B ≤ 1$ | 100ドル$ |
$N = 6,ドル $S = [1, 2, 3, 1, 2, 1]$라고 하자. 그레이더가 guess_palindromicity(6)을 호출한다. 함수 호출의 예가 아래에 보여진다.
| Call | Return |
|---|---|
count_pair(0, 1, 2) |
0ドル$ |
count_pair(3, 4, 5) |
1ドル$ |
count_pair(0, 3, 5) |
3ドル$ |
find_character(2, {0, 1, 3, 4, 5}) |
0ドル$ |
find_character(1, {0, 2, 4}) |
1ドル$ |
Sample grader는 아래와 같은 형식으로 입력을 받는다.
프로그램이 Accepted로 판정되면, 샘플 그레이더는 Correct : A B 를 출력한다. 여기서, A는 count_pair를 사용한 횟수, B는 find_character을 사용한 횟수이다.
프로그램이 Wrong Answer로 판정되면, 샘플 그레이더는 Wrong : MSG 를 출력한다. 여기서 MSG는 다음 중 하나이다.
Wrong Input: 입력 형식이 잘못되었다.Invalid Query: 쿼리에 넣은 값이 잘못된 값이다.Wrong Guess: $S$가 팰린드롬인데 guess_palindromicity가 0ドル$을 반환했거나, 그 반대인 경우이다.Sample grader는 실제 채점에서 사용하는 그레이더와 다를 수 있음에 유의하라.
Olympiad > 국제정보올림피아드 대표학생 선발고사 > 2024 > 2차 선발고사 3번
C++17, C++20, C++17 (Clang), C++20 (Clang)