forked from cotes2020/jekyll-theme-chirpy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
561f613
commit 32281ea
Showing
1 changed file
with
54 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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점 떨어졌습니다. 한편으로는 제게 안 맞는 셋과 보편적 사람들에 안 맞는 셋이 비슷한 것 같기도 하고, 한편으로는 위기 대처 능력이 조금 늘은 것 같아 기분이 좋기도 합니다. | ||
- 어쨌든 결론적으로 오렌지 등반에 실패했습니다. 다음 코포가 언제일지 모르겠네요. |