Date:

1) 문제 링크

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

2) 접근

분할 정복 알고리즘을 이용했다. 1725번 문제와 접근 방식, 풀이가 매우 유사하며 마찬가지로 시간복잡도 $O(NlogN)$으로 풀었다.

3) 풀이

#include <iostream>
#include <algorithm>
using namespace std;

long long N, A[100000];

long long MaxScore(int s, int e){
    if(s == e) { return 0; }
    if(s+1 == e) { return A[s]*A[s]; }

    int mid = (s+e)/2;
    long long result = max(MaxScore(s, mid), MaxScore(mid, e));

    long long sum = A[mid], min_val = A[mid];
    int l = mid, r = mid;
    while(r-l+1 < e-s){
        int p = (l>s) ? A[l-1] : -1;
        int q = (r<e-1) ? A[r+1] : -1;

        if(p >= q){
            --l;
            sum += A[l];
            min_val = min(min_val, A[l]);
        }
        else{
            ++r;
            sum += A[r];
            min_val = min(min_val, A[r]);
        }

        result = max(result, sum*min_val);
    }
    return result;
}

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> N;
    for(int i=0; i<N; ++i){
        cin >> A[i];
    }
    cout << MaxScore(0, N);
    return 0;
}

image

4) 피드백

마찬가지로 스위핑 알고리즘을 이용할 수 있는 문제였다. 스택을 이용해서.
‘재미지’님의 코드. 12ms가 뜬다고 한다.

Leave a comment