2026년 1월 12일~13일에 진행한 Codeforces Round 1072 (Div. 3)에 참가했습니다. 총 5문제를 해결하여 퍼포먼스 1793을 기록하였고, 레이팅은 74점 상승한 1576이 되었습니다.
명의 사람을 2~3명으로 이루어진 팀으로 나눈 뒤, 이 팀을 두 그룹에 적당히 분배해 그룹의 인원 수 차이를 최소화하는 문제입니다. 간단한 조건 분기로 풀 수 있어 빠르게 해결했습니다.
예제를 손으로 풀어 보면서 규칙을 찾아 갔습니다. 모래시계를 계속 뒤집는 동안 이면 모래가 떨어지다가 멈추는 것을 일정 주기로 반복하고, 그렇지 않으면 모래가 모두 떨어지는 순간에 뒤집는 것과 동치임을 확인했습니다. 이를 따라 구현해 보았지만, WA를 받았습니다.
사과 더미를 반으로 나누는 것을 반복하기 때문에, 이진수로 접근하면 되지 않을까 생각했습니다. 그래서 Python의 bin 함수를 사용해 구현해 보았지만, WA를 받았습니다.
C 제출 이후 B에서 WA를 받은 것을 확인했습니다. 손으로 몇 가지 케이스를 입력해 보니, 일 때 반례가 있음을 확인했습니다. "모래가 모두 떨어지는 순간에 뒤집는 것과 동치"인 것이 뒤집는 동안에는 적용되지만, 방을 떠난 후에는 적용되지 않는 것이었습니다. 이를 수정하여 AC를 받아냈습니다.
C번에서도 WA가 뜬 것을 확인했습니다. 조금 더 생각해 보니, 그래프 탐색으로 해결할 수 있겠다는 생각이 들었습니다. 그래서 BFS를 구현하고 제출했으나, WA를 받았습니다.
문제를 잘 읽어보면 이진수 표현에서 1인 비트의 개수로 성공 여부를 판정할 수 있음을 알 수 있습니다. 자연수 에 대해 비트의 개수는 이므로, 조합을 직접 계산하여 경우의 수를 구했습니다.
WA가 한 번 더 떴고, 디버깅을 시작했습니다. 얼마 지나지 않아 일 때 예외 처리를 하지 않았음을 알게 되었습니다. 이를 추가하여 AC를 받았습니다.
E에서 아이디어를 얻지 못해 F로 넘어왔고, 트리 DP임을 쉽게 알 수 있었습니다. 각 정점별로 해당 정점을 루트로 하는 서브트리에서, 자손 정점을 흔든 횟수를 으로 나눈 나머지가 가 되도록 할 수 있는지 여부를 관리했습니다. 재귀를 사용하기 때문에 C++로 코딩했지만, 정작 제출을 Python으로 해 CE를 받았습니다.
CE가 뜨자마자 언어를 바꾸어 다시 제출했고, AC를 받았습니다.
퍼포먼스 1793, 레이팅 변화 +74로 매우 좋은 성적을 거두었습니다. 24점만 올리면 블루에 가는데, 앞으로 더 열심히 해야겠습니다.