Skip to content

Commit

Permalink
Create 2024-03-06-cf932.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Annyeong-One authored Mar 6, 2024
1 parent 561f613 commit 32281ea
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions _posts/2024-03-06-cf932.md
Original file line number Diff line number Diff line change
@@ -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점 떨어졌습니다. 한편으로는 제게 안 맞는 셋과 보편적 사람들에 안 맞는 셋이 비슷한 것 같기도 하고, 한편으로는 위기 대처 능력이 조금 늘은 것 같아 기분이 좋기도 합니다.
- 어쨌든 결론적으로 오렌지 등반에 실패했습니다. 다음 코포가 언제일지 모르겠네요.

0 comments on commit 32281ea

Please sign in to comment.