Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented May 8, 2025

🧷 문제 링크

https://www.acmicpc.net/problem/16858

🧭 풀이 시간

50분

👀 체감 난이도

✏️ 문제 설명

캣타워에 N개의 보금자리가 있고, 각 보금자리 i에는 C[i]마리의 암컷 or 수컷 고양이가 살고 있다. 보금자리들은 트리 구조를 이룬다.

수컷 고양이는 최대 높이 제한 V[i] 이내에 있는 암컷 고양이에게 도달하면 소개팅이 이루어진다.

성사될 수 있는 소개팅 횟수의 최댓값을 구해보자.

🔍 풀이 방법

[사용한 알고리즘]

  • 그리디 알고리즘
  • Map
  • Smaller to Larger
  • 이분 탐색

수컷을 아래로 떨어뜨리는 대신, 암컷이 올라가는 형태로 생각해도 무방하다.

그리디 관찰

암컷 고양이를 올리면서 이동 거리를 구해놓고, 수컷 고양이 중 이 이동거리에 높이 제한이 가장 가까운 고양이와 소개팅을 하는 것이 항상 이득이다.
그 전에 미리 소개팅을 해버리면, 더 위에 있는 수컷 고양이와 배정될 기회를 잃어버리기 때문이다.

암컷 고양이 관리

리프 노드부터 간선을 타고 올라가며 암컷 고양이의 정보를 관리한다.
암컷 고양이가 올라온 거리 및 그 개체수를 저장해야 하므로, Map으로 관리한다. (key = 거리, value = 개체수)

두 Map을 합칠 때는 Smaller to Larger 테크닉으로 합친다. 시간복잡도 = $O(N \log^2{N})$

소개팅 성사시키기

수컷 고양이가 있는 정점에 도달했다면, Map에서 이분 탐색(lower bound, lower 등)으로 성사 가능한 암컷 고양이의 정보를 찾고, 정답을 갱신시킨다.

⏳ 회고

컨테이너의 iterator에 대한 깊은 이해가 필요했다.
진짜 어렵다

@oncsr oncsr added the success 👍 해설을 보지 않고 풀었을 때 label May 8, 2025
@ShinHeeEul ShinHeeEul merged commit bf39803 into main May 8, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants