핵심은 \(\min(|dx|,|dy|)\)를 직접 다루지 않고, 먼저 \(\max(|dx|,|dy|)\)를 1차원 절댓값 차이 합으로 바꾸는 것이다.
문제 정보
문제 요약:
- 길이 \(N\)인 두 수열 \(p, q\)가 주어진다.
- 다음 값을 계산한다: \[ \sum_{i=1}^{N}\sum_{j=1}^{N}\min(|p_i-p_j|,\;|q_i-q_j|) \]
제한 조건:
- \(1 \le N \le 1{,}000{,}000\)
- \(1 \le p_i, q_i \le 1{,}000{,}000\)
입출력 예제
예제 입력 1:
| |
예제 출력 1:
| |
접근 방식
핵심 항등식
두 점의 차이를 \(dx = p_i-p_j\), \(dy=q_i-q_j\)라 두면,
- \(\min(|dx|,|dy|) = |dx| + |dy| - \max(|dx|,|dy|)\)
- 그리고 다음이 성립한다: \[ \max(|dx|,|dy|) = \frac{|dx+dy| + |dx-dy|}{2} \]
여기서
- \(dx+dy = (p_i+q_i) - (p_j+q_j)\)
- \(dx-dy = (p_i-q_i) - (p_j-q_j)\)
이므로, \(\max(|dx|,|dy|)\)의 전체 합은 결국
(p+q)와 (p-q)의 1차원 절댓값 차이 합으로 계산된다.
정리 (unordered pair 기준)
다음 값을 모두 “쌍 (i<j)”에 대해 계산하자.
- \(S_p = \sum_{i
- \(S_q = \sum_{i
- \(S_{+} = \sum_{i
- \(S_{-} = \sum_{i
- \(S_q = \sum_{i
그러면 (대칭성을 이용해) 최종 답은:
\[ \text{Ans} = 2S_p + 2S_q - (S_{+} + S_{-}) \]알고리즘 설계 (Mermaid)
flowchart TD
A["입력: N, 수열 p[1..N], q[1..N]"] --> B["배열 s[i]=p[i]+q[i], t[i]=p[i]-q[i] 생성"]
B --> C["함수 F(v): sort(v) 후Σ_{i D["S_p = F(p), S_q = F(q), S_+ = F(s), S_- = F(t)"]
D --> E["Ans = 2*S_p + 2*S_q - (S_+ + S_-)"]
E --> F["Ans 출력"]
복잡도 분석
| 항목 | 복잡도 | 비고 |
|---|---|---|
| 시간 복잡도 | \(O(N \log N)\) | 4개 배열 정렬 |
| 공간 복잡도 | \(O(N)\) | p, q, p+q, p-q 저장 |
C++ 구현 코드
| |
코너 케이스 및 실수 포인트
| 케이스 | 설명 | 처리 |
|---|---|---|
| N=1 | 합은 0 | 정렬/누적합 로직 그대로 0 |
| 큰 N (1e6) | 정렬 4번이 병목 | -O2, fast I/O, 불필요한 복사 최소화 |
| 오버플로우 | 쌍 합이 매우 큼 | 누적/곱은 __int128 사용 |
| 음수 (p-q) | t 배열은 음수 가능 | 정렬 기반 계산은 문제 없음 |
![Featured image of post [Algorithm] C++ 백준 22878번: 간단한 문제](/post/algorithm/2025-12-19-boj-22878-simple-problem-cpp-solution/wordcloud_hu_c7dc434a498b91d8.png)
![[Algorithm] C++ 백준 20176번: Needle](/post/algorithm/2025-12-19-boj-20176-needle-cpp-solution/wordcloud_hu_d0eac9b197bd7f0d.png)
![[Algorithm] C++ 백준 20506번: Kaisar - 생존](/post/algorithm/2025-12-19-boj-20506-kaisar-survival-cpp-solution/wordcloud_hu_1115df393a79effd.png)
![[Algorithm] C++ 백준 22878번: 간단한 문제](/post/algorithm/2025-12-19-boj-22878-simple-problem-cpp-solution/wordcloud_hu_9cd053bc1be8114a.png)
![[Algorithm] C++ 백준 25201번: 보드 뒤집기 게임](/post/algorithm/2025-12-19-boj-25201-board-flipping-game-cpp-solution/wordcloud_hu_22b1d8c414e9b6d9.png)
![[Algorithm] C++ 백준 2586번: 소방차](/post/algorithm/2025-12-19-boj-2586-firetruck-cpp-solution/wordcloud_hu_c7df555f7b0ecd9e.png)
![[Algorithm] C++ 백준 33543번: 둘이 한 팀](/post/algorithm/2025-12-19-boj-33543-two-in-a-team-cpp-solution/wordcloud_hu_791f9bd4be457f3c.png)
![[Algorithm] C++ 백준 3006번: 터보소트](/post/algorithm/2025-12-19-boj-3006-turbosort-cpp-solution/wordcloud_hu_cd4b400156e60fdb.png)
![[Algorithm] C++ 백준 17965번: Absolute Game](/post/algorithm/2025-12-19-boj-17965-absolute-game-cpp-solution/wordcloud_hu_f6800a55fcd520be.png)