|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 |
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
typedef unsigned long long ull;
int n;
vector<int> arr;
int solve(int l, int r)
{
if (r == l)return arr[l];
int mid = (l + r) / 2;
//두개로 나눈당
int ret = max(solve(l, mid), solve(mid + 1, r));
//걸쳐있는 답을 골라본당
int lWall= mid, hWall = mid + 1;
int h = min(arr[lWall], arr[hWall]);
ret = max(ret, h * 2);
//겹친 부분에서 찾아보장
while (l < lWall || hWall < r)
{
if (hWall < r && (lWall == l || arr[hWall + 1] > arr[lWall - 1]))
{
++hWall;
h = min(h, arr[hWall]);
}
else
{
--lWall;
h = min(h, arr[lWall]);
}
ret = max(ret, h * (hWall - lWall + 1));
}
return ret;
}
int main()
{
cin >> n;
arr.resize(n);
for (auto &i : arr)
cin >> i;
cout << solve(0, n - 1) << endl;
} |
cs |
ㅇㅇ
https://algospot.com/judge/problem/read/FENCE
이문제랑 정확히 똑같아서
전에 푼거 그대로 복붙함
전에 푼거라기보단 사실..나도 배낀거같지만
고맙다~ 이 은혜 언젠가 갚을께~