lml 2023. 10. 13. 14:28

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

 

support와 conspiracy 두 개의 그룹으로 나누어야 한다.

support는 완전그래프고, conspiracy는 사이에는 간선이 없도록 해야 한다.

 

단상 1.

간선의 총 개수를 m이라고 하자.

그러면 support 그룹이 a명이면 sum_of_deg(support) = m + a * (a - 1) / 2 가 성립해야 한다.

혹시 이거만 성립한다면 충분한가?

X = (support간 간선), Y = (support-conspiracy), Z = (conspircacy간 간선)이라면, 위 식은 다음과 같다

-> X * 2 + Y = X + Y + Z + a * (a - 1) / 2 -> X = Z + a * (a - 1) / 2

-> 이때 X가 a * (a - 1) / 2를 넘을 수는 없으므로 저 식만 만족하면 끝이다.

 

단순한 dp로는 불가능하고 FFT도 좀 가능성이 있어보이긴 하는데...

x개를 모아서 합이 m + x * (x - 1) / 2가 되도록 하는 방법의 수를 하려면 복잡도가 최소 O(NMlgN)은 뜨겠는데..

adj[i] >= x - 1인 경우에만 포함될 수 있다는 것으로 계산을 줄일 수 있을까?

//2SAT에 의한 생각 전환

 

단상 2.

이거 2sat 느낌으로 되는게 아닌가?

-> u, v 사이에 간선이 있다면 (~u or ~v)

-> u, v 사이에 간선이 있다면 (u or v)

-> 근데 2SAT의 경우의 수를 세는 거는 일반적인 케이스에선 불가능하다고 알고있다.

//빠른 포기

 

단상 3.

어떤 답이 되는 분류가 있다고 가정하자.

그렇다면 여기에서 support는 숫자가 변화한다면 1명만 추가하거나, 1명만 제거할 수 있다.

-> 2명이 추가 가능하다면, 이 둘 사이에 간선이 있는 것이므로, 지금 상태에 모순

-> 2명이 제거 가능하다면, 이 둘 사이에 간선이 없는 것이므로, 지금 상태에 모순

따라서 한 state만 찾으면, 여기서 1명 제거, 1명 추가, 1명 빼고 + 1명 추가만 세보면 된다

-> 한 state를 찾는 것은 2sat로 하면 된다.

-> 이후는 걍 실제로 세보면 된다. a가 혼자 빠질 수 있는지, b가 혼자 더해질 수 있는지, a와 b가 동시에 움직이는지

추가적으로 conspiracy나 support는 빈 집단일 수 없기 때문에 이것의 예외처리를 해주어야 한다.

 

다른 풀이 1)

단상 1에서 이 생각을 미처하지 못하였다.

만일 크기가 X라면, support에 속한 애들은 deg가 X - 1보다 크거나 같고, 다른 애들은 X보다 작거나 같다.

-> 따라서 대충 보았을 때 deg[support] + 1 >= deg[conspiracy]가 성립한다.

-> 여기에 아까의 sum_of_deg 조건을 추가하면 어렵지 않게 찾을 수 있다.

 

다른 풀이 2)

3개의 점을 살펴보자.

만일 2개만 서로 연결되어 있다면, 나머지 1개는 무조건 conspiracy이다.

만일 1개만 모두에게 연결되어있다면, 그 점은 무조건 support이다.

이를 통해서 모든 삼각형을 보면 support, conspiracy로 몇 개가 확정되고, 남는 점들은 모두 연결되거나 모두 분리됨

-> 여기서부터는 내가 하듯이 1개 넘게 뭐가 안되기 때문에 casework를 하면 된다고 한다.