Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Aug 31, 2025

🧷 문제 링크

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

🧭 풀이 시간

90분

👀 체감 난이도

✏️ 문제 설명

간선이 없이 N개의 정점으로 이루어진 그래프에 쿼리들을 수행해보자.

  • 1 A B : A와 B를 잇는 간선을 추가
  • 2 A B : A와 B를 잇는 간선을 제거
  • 3 A B : A와 B가 연결되어 있는지 확인

🔍 풀이 방법

  • 분리 집합
  • 분할 정복

각 쿼리가 들어온 시점을 모두 기록해두고, 시간을 기준으로 분할 정복을 하게 되면, 시간 구간이 총 NlogN개 만들어진다.
특정 간선의 lifetime을 미리 계산해두고 각각의 시간 구간에 완전히 포함될 때만 그 간선을 해당 시간 구간에 저장해둔다.

마지막에 dfs로 시간 구간 트리를 순회하면서 각 구간에 속하는 간선들을 분리 집합으로 이었다가 마지막에 다시 rollback해준다. 이렇게 하면 연결성 판별이 가능.
rollback을 하기 위해서, 연산 최적화 시 경로 압축 대신 union by rank를 이용해 find연산을 O(logN)으로 줄인다.

⏳ 회고

배워가는 게 정말 많았음.
분리 집합 union연산이 rollback 가능하다는 것을 알게 됐고,
시간 축을 기준으로 분할 정복을 수행하는 관찰도 도움이 많이 되었다.

@oncsr oncsr self-assigned this Aug 31, 2025
@oncsr oncsr added the hint 💡 반례를 참고했거나 힌트를 얻고 풀었을 때 label Aug 31, 2025
@ShinHeeEul ShinHeeEul merged commit 1c50a06 into main Aug 31, 2025
1 check passed
@Ukj0ng
Copy link
Contributor

Ukj0ng commented Aug 31, 2025

새로 배운 게 이거임?

@oncsr
Copy link
Contributor Author

oncsr commented Aug 31, 2025

새로 배운 게 이거임?

맞음

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

hint 💡 반례를 참고했거나 힌트를 얻고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants