문제 링크입니다: https://www.acmicpc.net/problem/27989
맥스 펜윅 트리를 활용하는 문제였습니다.
알고리즘은 다음과 같습니다.
1. cache는 수열 A를 오름차순으로 정렬한 배열입니다.
2. 수열 A를 순회하며 이분탐색을 통해 현재 A[i]가 cache에 위치한 인덱스를 찾습니다.
2.1 +1을 하는 이유는 A는 0-인덱스인 반면 펜윅 트리는 1-인덱스이기 때문입니다.
3. A[i]보다 작은 모든 값들에 대해 현재까지 계산된 최대 부분합을 구합니다.
4. 3번에서 구한 값과 A[i]를 합치면 현재 인덱스까지의 최대 부분합을 구할 수 있습니다. 해당 값을 펜윅 트리의 idx 위치에 업데이트합니다.
5. 2 ~ 4번 과정을 반복한 뒤 N번째 인덱스에 대해 쿼리를 수행하면 답을 구할 수 있습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <cstring> | |
#include <algorithm> | |
using namespace std; | |
const int MAX = 3e5 + 3e2; | |
int N; | |
long long A[MAX]; | |
long long cache[MAX]; | |
long long tree[MAX]; | |
void update(int idx, long long value) | |
{ | |
while (idx <= N) | |
{ | |
tree[idx] = max(tree[idx], value); | |
idx += idx & -idx; | |
} | |
} | |
long long query(int idx) | |
{ | |
long long result = 0; | |
while (idx) | |
{ | |
result = max(result, tree[idx]); | |
idx -= idx & -idx; | |
} | |
return result; | |
} | |
int main() { | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
cin >> N; | |
for (int i = 0; i < N; i++) | |
{ | |
cin >> A[i]; | |
cache[i] = A[i]; | |
} | |
sort(cache, cache + N); | |
for (int i = 0; i < N; i++) | |
{ | |
int idx = lower_bound(cache, cache + N, A[i]) - cache + 1; | |
long long pSum = query(idx - 1); | |
update(idx, pSum + A[i]); | |
} | |
cout << query(N) << "\n"; | |
return 0; | |
} |

개발환경:Visual Studio 2022
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 7469번 K번째 수 (1) | 2025.01.18 |
---|---|
백준 1017번 소수 쌍 (0) | 2024.10.30 |
백준 1344번 축구 (0) | 2024.05.08 |
백준 17837번 새로운 게임 2 (0) | 2024.05.07 |
백준 1535번 안녕 (2) | 2024.05.07 |