http://acm.pku.edu.cn/JudgeOnline/problem?id=2785
Time Limit: 15000MS
Case Time Limit: 5000MS
Description
The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .
Input
The first line of the input file contains the size of the lists n (this value can be as large as 4000). We then have n lines containing four integer values (with absolute value as large as 228 ) that belong respectively to A, B, C and D .
Output
For each input file, your program has to write the number quadruplets whose sum is zero.
Sample Input
6 -45 22 42 -16 -41 -27 56 30 -36 53 -37 77 -36 30 -75 -46 26 -38 -10 62 -32 -54 -6 45
Sample Output
5
Hint
Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).
Source
Southwestern Europe 2005
Solving
집합 a, b, c, d 에서 원소를 하나씩 꺼내 그 합이 0이 되는 경우가 몇 가지인지 찾아야 한다.
모든 경우를 검사해서 확인하는 방법이 있으나 이 경우 n^4의 단위 연산이 필요하다. n이 최대 4000까지 주어지므로 n^4=256000000000000으로 너무 크다. 보다 빠르게 문제를 해결할 수 있는 방법이 필요하다.
이런 문제의 경우 집합을 반으로 나눠서 각각 처리 한뒤 소팅을 하여 문제를 해결할 수 있는 경우가 많다. 이 문제도 이런 방법으로 해결할 수 있다.
n^2=16000000 으로 여전히 크지만 Case Time Limit이 5초 이므로 충분하다.
a,b 집합과 c,d집합을 따로 처리하여 a+b의 모든 경우와 c+d의 모든 경우를 계산한 후 소팅한다. 소팅의 시간복잡도는 O(n log n)이다. 이때 n은 4000이 아니라 16000000이다 실질적으로 총 시간복잡도는 n^2 log n^2 = 2 * n^2 log n = 약 100000000 으로 크지만 5초 이내에는 실행 가능하다.
a+b의 모든 경우와 c+d의 모든 경우가 소팅되 되었으면 한쪽은 오름차순으로 한쪽은 내림차순으로 원소를 비교하면서 그 합이 0이 되는 갯수를 세면 된다. 합이 양수인 경우는 합을 작게 만들어야 하므로 내림차순쪽의 원소를 하나 이동한다. 반대의 경우는 합이 커져야 하므로 오림차순쪽의 원소를 하나 이동한다.
Solving
집합 a, b, c, d 에서 원소를 하나씩 꺼내 그 합이 0이 되는 경우가 몇 가지인지 찾아야 한다.
모든 경우를 검사해서 확인하는 방법이 있으나 이 경우 n^4의 단위 연산이 필요하다. n이 최대 4000까지 주어지므로 n^4=256000000000000으로 너무 크다. 보다 빠르게 문제를 해결할 수 있는 방법이 필요하다.
이런 문제의 경우 집합을 반으로 나눠서 각각 처리 한뒤 소팅을 하여 문제를 해결할 수 있는 경우가 많다. 이 문제도 이런 방법으로 해결할 수 있다.
n^2=16000000 으로 여전히 크지만 Case Time Limit이 5초 이므로 충분하다.
a,b 집합과 c,d집합을 따로 처리하여 a+b의 모든 경우와 c+d의 모든 경우를 계산한 후 소팅한다. 소팅의 시간복잡도는 O(n log n)이다. 이때 n은 4000이 아니라 16000000이다 실질적으로 총 시간복잡도는 n^2 log n^2 = 2 * n^2 log n = 약 100000000 으로 크지만 5초 이내에는 실행 가능하다.
a+b의 모든 경우와 c+d의 모든 경우가 소팅되 되었으면 한쪽은 오름차순으로 한쪽은 내림차순으로 원소를 비교하면서 그 합이 0이 되는 갯수를 세면 된다. 합이 양수인 경우는 합을 작게 만들어야 하므로 내림차순쪽의 원소를 하나 이동한다. 반대의 경우는 합이 커져야 하므로 오림차순쪽의 원소를 하나 이동한다.
'problem solving > Problem Solving' 카테고리의 다른 글
MPI Maelstrom (0) | 2008.10.07 |
---|---|
Tri Tiling (0) | 2008.10.07 |
Palindrome Numbers (0) | 2008.10.07 |
Sum of Factorials (0) | 2008.10.07 |
Crazy tea party (0) | 2008.10.07 |