문제 링크: https://www.acmicpc.net/problem/32037
구사과님의 problem solving에 있는 문제이다. 안타깝게도 나와 구사과님을 제외하고 1명 밖에 안 풀었다.
1. Graph construction
S를 sink, T를 source라고 했을 때 다음과 같이 그래프를 만들어보자. 모든 간선의 capacity는 1이다.
- 모든 1≤i≤n에 대해 S→(i,0)
- 모든 1≤i≤n에 대해서 (i,0)→(A[i],1), (i,0)→(B[i],1)
- 모든 1≤i≤10000에 대해서 (i,1)→(i,2)
- 모든 1≤i≤n에 대해서 (C[i],2)→(i,3), (A[i],2)→(i,3)
- 모든 1≤i≤n에 대해서 (i,3)→T
기존의 B와 원소의 교체가 이루어진 B을 구분하기 위해 최종적인 B와 C를 B′, C′이라고 부르자.
이 그래프의 최대 유량은 B′와 C′의 교집합의 최대 크기를 의미한다. 이때 교집합은 모든 선택된 (i,1)→(i,2) 간선들이다.
2. 해 구하기
B′과 C′의 교집합의 크기가 최대인 경우는 1에서 구했다. 이제 B′와 C′의 교집합의 크기를 유지하면서 교집합에 없는 원소들을 제거하는 시행들에 대해서 알아보자.
일반성을 잃지 않고 B′[i]가 B′∩C′에 없다고 하자.
- B′[i]=A[i]인 경우에는 C′[i]를 A[i]로 교체한다. 이러면 A[i]가 B′∩C′에 추가되어 교집합의 크기가 감소하지 않는다.
- B′[i]=B[i]인 경우에는 B′[i]를 A[i]로 교체한다. B′[i]는 B′∩C′에 없던 원소이기 때문에 교집합의 크기가 감소하지 않는다.
위의 시행을 계속 하면 B′과 C′에 B′[i]=A[i] (C′[i]=A[i])를 만족하는 원소가 늘어난다. 따라서 위의 시행을 더 이상 실행할 수 없게 되는 순간이 오고, 그 때는 B′∩C′에 없는 B′ 혹은 C′의 원소가 없다는 것을 의미한다.
1에서 최대 유량을 구하는 것은 나이브하게 O(n2)에 구할 수 있다. 하지만 내 O(n2) 코드는 TLE가 났다. Dinic을 쓰면 O(n1.5)에 구할 수 있다고 한다. 2에서 최종 해를 구하는 것은 O(n2)에 할 수 있다. 상수가 작아서 통과한다.
'ps (문제)' 카테고리의 다른 글
색종이 붙이기 (0) | 2024.10.18 |
---|---|
[IOI 2024] Hieroglyphs (0) | 2024.09.23 |
USACO 2024 January Contest (Gold Division) (0) | 2024.05.28 |
RUN 2024 Spring Contest 풀이(내가 출제한 문제들) (0) | 2024.05.08 |
SNUPC 2022 G번 수 만들기 (0) | 2024.04.04 |