| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 2 초 | 1024 MB | 165 | 35 | 32 | 28.829% |
당신은 다음과 같은 문제를 두 번 해결해야 한다.
길이 $N$의 수열 $A$와 길이 2ドルN$의 수열 $B$가 있다. 두 번의 문제 해결에서 $N$은 같지만 $A$는 다를 수 있다. 수열 $A$의 내용은 알 수 없고, $B$는 각 문제를 해결하기 시작할 때 모든 원소가 0ドル$이다.
부분 수열의 XOR합이란, 부분 수열에 들어있는 모든 원소를 XOR한 값을 의미한다.
당신은 수열 $A$의 모든 짝수 크기의 부분 수열의 XOR합 중 최댓값을 찾아야 한다.
당신은 다음과 같은 연산을 할 수 있다.
A $i$ $j$ : $B_i$의 값을 $B_i \oplus A_j$로 바꾼다. 이 연산은 두 번의 문제 해결에서 총합하여 최대 3ドルN$번 할 수 있다. C $i$ $x$ : $B_i$의 값을 $B_i \oplus x$로 바꾼다. 이 연산은 두 번의 문제 해결에서 총합하여 최대 2ドルN$번 할 수 있다. Q $k$ $v_{1}$ $v_{2}$ $\cdots$ $v_{k}$ : 길이 $k$의 수열 $B_{v_{1}}, B_{v_{2}}, \cdots B_{v_{k}}$의 모든 부분수열의 XOR합 중 최댓값을 찾는다. 이 연산은 두 번의 문제 해결에서 총합하여 최대 2ドル$번 할 수 있으며 $k$의 합은 총합하여 2ドルN$을 넘길 수 없다.! $x$ : 문제의 답 $x$를 알아냈다면 이 연산을 통해 답을 제출할 수 있다.연산들을 적절히 사용하여 문제의 답을 찾아내 보자.
각 연산을 할 수 있는 횟수 및 Q 연산에서의 $k$의 합이 제한되어 있으며, 자세한 사항은 인터랙션 항목을 참조하여라.
첫째 줄에 수열의 길이 $N$이 주어진다. $(2 \leq N \leq 100,000円)$
숨겨진 수열 $A$의 원소 $A_i$는 모두 0ドル$보다 크거나 같고 5ドル \times 10^8$보다 작거나 같은 정수이다.
이후 당신과 채점 시스템과의 인터랙션이 진행된다.
당신은 표준 출력에 다음 연산을 각 줄에 출력하는 것으로, 채점 시스템과 인터랙션할 수 있다. 각 토큰은 공백으로 구분하며, 각 연산의 끝에 개행문자를 출력하여야 한다.
A $i$ $j$
C $i$ $x$
Q $k$ $v_1, v_2, \cdots, v_k$
! $x$ : 문제의 답 $x$를 알아냈다면 이 연산을 통해 답을 제출할 수 있다.
만약 연산이 잘못된 연산이거나 제한을 초과하였다면 당신은 -1을 다음 줄에 입력받으며 이 입력이 주어질 경우 프로그램을 즉시 종료해야 한다.
Q 연산과 ! 연산 이후에는 표준 출력 버퍼를 비워야 한다.
각 언어별로 표준 출력 버퍼를 비우는 방법은 다음과 같다. 기타 언어의 경우, 언어의 레퍼런스 페이지를 참조하여라.
fflush(stdout)std::cout << std::flushSystem.out.flush()sys.stdout.flush()std::io::stdout().flush()4 7 14
A 1 1 A 2 2 C 1 4 A 3 4 A 3 1 Q 3 1 2 3 ! 7 A 1 1 A 2 2 A 3 3 A 4 4 Q 4 1 2 3 4 ! 12
첫 번째 문제에서 $A = [1,2,3,4]$이다.
첫 번째 연산 Q를 사용할 때 $B = [5,2,5,0,0,0,0,0]$이고, 연산의 결과는 집합 $\{5,2\}$의 XOR합인 5ドル \oplus 2=7$이다.
첫 번째 문제의 정답은 3ドル\oplus 4=7$이다.
두 번째 문제에서 $A = [2,4,2,8]$이다.
두 정수 $a,ドル $b$에 대해 $a \oplus b$는 $a$와 $b$를 XOR한 값으로 정의한다.
부분 수열은 수열에서 0ドル$개 이상의 수를 제거하여 만든 수열을 의미한다.
Contest > BOJ User Contest > 월간 향유회 > 월간 향유회 2025. 01. E번