From 32281eaaf903987b74c81530430a74ccfaed3342 Mon Sep 17 00:00:00 2001 From: Annyeong1 <79385636+Annyeong-One@users.noreply.github.com> Date: Wed, 6 Mar 2024 23:32:08 +0900 Subject: [PATCH] Create 2024-03-06-cf932.md --- _posts/2024-03-06-cf932.md | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 _posts/2024-03-06-cf932.md diff --git a/_posts/2024-03-06-cf932.md b/_posts/2024-03-06-cf932.md new file mode 100644 index 00000000000..72f97de1f55 --- /dev/null +++ b/_posts/2024-03-06-cf932.md @@ -0,0 +1,54 @@ +--- +title: Codeforces Round 932 (Div. 2) +author: Annyeong1 +date: 2024-03-06 17:50:00 +0900 +categories: [CP, Codeforces] +tags: [cp, codeforces, div2] +math: true +mermaid: true +--- +코드포스 932번 대회 일지입니다. 저랑 되게 안 맞는 셋이었는데 다행히도 레이팅을 유지했습니다. +## 0:00~0:04 +- A번을 잡았습니다. +- 홀수 짝수 나눠서 문자열과 그 reverse를 비교해주면 됩니다. +- strcmp를 오랜만에 써봤습니다. strcmp의 반환값이 좀 헷갈려서, 일단 짜고 디버깅했습니다. +- 그러더니 맞았습니다. + +## 0:04~0:21 +- B번을 잡았습니다. +- 발상 1(3분): 여러 개의 그룹으로 나눌 수 있다면 2개의 그룹으로 나눌 수 있습니다. +- 발상 2(4분): 0이 없다면 아무렇게나 나눠도 됩니다. +- 발상 3(8분): 처음으로 없는 숫자를 찾아서, 그 숫자가 MEX가 되는 분할을 찾아야 합니다. +- 발상 4(10분): 그 전의 숫자는 모두 2개 이상씩 있어야 하며, 첫 번째 분할은 그중 하나씩을 가지고 있어야 합니다. 모든 숫자의 occurrence를 찾고 그중 첫 번째의 위치를 저장해다가, 그 max값까지를 한 그룹, 그 이후를 다른 그룹으로 나누면 됩니다. (따라서, 발상 2는 굳이 처리할 필요가 없습니다.) +- 구현했고 틀렸습니다. (13분) +- 발상 5(14분): 뒤쪽 그룹에도 각 숫자가 하나씩은 들어가야 합니다. 즉, 모든 숫자의 마지막 occurence를 저장해 그 min을 찾은 뒤, 첫번째 위치의 max와 비교해 그룹이 겹치면 -1을 출력해야 합니다. +- 구현했고 맞았습니다. (17분) + +## 0:21~0:48 +- C번을 잡았습니다. +- 문제를 이해하는 데 5분 가량을 소모했습니다. +- 발상 1(8분): b는 최대최소만 관리하면 되고, a는 합을 찾아야 합니다. 따라서 b에 대해 오름차순 정렬하는 것이 효율적입니다. +- 발상 2(11분): 제곱이므로, 정렬해두고 a를 누적합해서 모든 $N^2$개 구간에 대해 합이 들어가는지 보면 됩니다. +- 구현했고 예제에서 막혔습니다. +- 발상 3(15분): 그저 누적합하는 것이 아니고, b의 구간이 정해지면(즉, b의 최대최소가 정해지면) 그 안에서 최대한 작은 a를 많이 찾아 더해야 합니다. +- 발상 4(17분): 이것을 pq로 관리할 수 있습니다. b의 시점을 하나 잡고, b의 최댓값을 순서대로 돌며 '합에 안 들어가는 수'를 작은 것 순으로, '합에 들어가는 수'를 큰 것 순으로 pq에 넣습니다. 매번 더 작은 수를 포함하도록 연산하고 이때 pq의 크기 최댓값이 답이 됩니다. +- 구현했고 예제에서 디버깅 후 맞았습니다. + +## 0:48~1:10 +- D번을 잡았습니다. +- 발상 1(3분): 되는 것을 세는 것보다 안 되는 것을 빼는 것이 더 빠릅니다. 즉, x+y 혹은 x-y 중 하나 이상이 집합에 있는 순서쌍을 찾으면 됩니다. +- 발상 2(4분): 집합 원소의 홀짝을 나누면 서로 독립적입니다. +- 발상 3(?): 둘 다 집합에 있는 것을 세거나, 하나는 있는데 하나는 없는 것을 세어야 합니다. 합이 집합에 있고 차가 없는 것을 세는 방법이 가장 빠르게 떠올랐습니다. +- 발상 4(?): 차가 있는 것은 합이 있던 없던 모두 세면 됩니다. 차가 정해지면 합의 범위가 결정되므로 순서쌍의 개수를 알 수 있습니다. +- 구현했고 맞았습니다. + +## 1:10~2:00 +- E번을 잡았습니다. (참고로 못 풀었습니다.) +- 최후 발상: 최대와 최소가 있습니다. 각 수는, 그 자릿수를 1으로 유지하여 더 큰 비트를 채우는 것에 기여하거나 작은 비트들을 모두 1으로 채우는 것에 기여할 수 있습니다. +- 변경 불가능한 비트는 단순히 저장하여 누적합하고, 나머지는 세그트리 등을 통해 관리할 수 있을 것 같습니다. +- 세그를 통해 관리하는 것이 너무 어려운 것 같아서 못 풀었습니다. + +## 후기 +- 셋이 되게 저랑 안 맞았던 것 같습니다. B, C, D 모두 별로 마음에 안 들었던 것 같습니다. 뭐 읽어보셨다면 아시겠지만 BC번을 reduction하는 데 시간이 너무 오래 걸렸고, 때문에 간단한 수학이었던 D를 푸는 데도 20분 가량을 소모했습니다. +- 그럼에도 레이팅이 딱 1점 떨어졌습니다. 한편으로는 제게 안 맞는 셋과 보편적 사람들에 안 맞는 셋이 비슷한 것 같기도 하고, 한편으로는 위기 대처 능력이 조금 늘은 것 같아 기분이 좋기도 합니다. +- 어쨌든 결론적으로 오렌지 등반에 실패했습니다. 다음 코포가 언제일지 모르겠네요.