BOJ 18317 - Farmer John Solves 3SUM

image.png

dp[l][r]=[l,r]dp[l][r]=[l,r] 구간에서 a[i]+a[j]+a[k]=0a[i]+a[j]+a[k]=0 이 되는 경우의 수라고 하자.

dp[l][r]=dp[l+1][r]+dp[l][r1]dp[l+1][r1]dp[l][r]=dp[l+1][r] + dp[l][r-1] - dp[l+1][r-1] 이다.

포함 배제의 원리?

나는 이 수식으로 안풀고 dp[l][r]=dp[l][r1]+c[l][r]dp[l][r]=dp[l][r-1] + c[l][r] 로 풀었다.

c[l][r]c[l][r] 이란 lr1l \sim r-1 구간에서 a[r]-a[r]a[i]+a[j]a[i]+a[j]의 개수이다.

사실 두 식은 전단사적으로 같으므로 c[l][r]=dp[l+1][r]dp[l+1][r1]c[l][r]=dp[l+1][r]-dp[l+1][r-1] 임을 알 수 있다.

어떤 방식으로 풀어도 O(N2)O(N^2)이 가능하고 쿼리는 개당 O(1)O(1)에 처리해줄 수 있다.

iPad에 PS IDE 환경을 구축했는데 cin untie를 안해줘서 계속 시간초과가 났다.

Tags:

Categories:

Updated:

Comments