-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBAEKJOON-2104.cpp
More file actions
110 lines (93 loc) · 2.51 KB
/
BAEKJOON-2104.cpp
File metadata and controls
110 lines (93 loc) · 2.51 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
int g_ValuesNum;
long long g_Values[100000];
long long g_MaximumResult;
void UpdateMaximumResult(long long maximumCandidate)
{
if (maximumCandidate > g_MaximumResult)
g_MaximumResult = maximumCandidate;
}
void Process_OptimizeRecursive(int idxLeft, int idxRight)
{
if (idxLeft == idxRight)
{
UpdateMaximumResult(g_Values[idxLeft] * g_Values[idxLeft]);
}
else
{
int idxDividePoint = (idxLeft + idxRight)/2;
long long inRangeMin = g_Values[idxDividePoint];
long long inRangeSum = g_Values[idxDividePoint];
long long inRangeMaximumResult = g_Values[idxDividePoint] * g_Values[idxDividePoint];
int idxExtendToLeft = idxDividePoint-1;
int idxExtendToRight = idxDividePoint+1;
bool leftEnd = idxDividePoint < idxLeft;
bool rightEnd = idxDividePoint > idxRight;
while (leftEnd == false || rightEnd == false)
{
if (leftEnd == false && rightEnd == false)
{
long long leftExtendValue = g_Values[idxExtendToLeft];
long long rightExtendValue = g_Values[idxExtendToRight];
if (leftExtendValue > rightExtendValue)
{
inRangeSum += leftExtendValue;
if (inRangeMin > leftExtendValue)
inRangeMin = leftExtendValue;
--idxExtendToLeft;
if (idxExtendToLeft < idxLeft)
leftEnd = true;
}
else
{
inRangeSum += rightExtendValue;
if (inRangeMin > rightExtendValue)
inRangeMin = rightExtendValue;
++idxExtendToRight;
if (idxExtendToRight > idxRight)
rightEnd = true;
}
}
else if(leftEnd == false)
{
long long leftExtendValue = g_Values[idxExtendToLeft];
inRangeSum += leftExtendValue;
if (inRangeMin > leftExtendValue)
inRangeMin = leftExtendValue;
--idxExtendToLeft;
if (idxExtendToLeft < idxLeft)
leftEnd = true;
}
else //rightEnd == false
{
long long rightExtendValue = g_Values[idxExtendToRight];
inRangeSum += rightExtendValue;
if (inRangeMin > rightExtendValue)
inRangeMin = rightExtendValue;
++idxExtendToRight;
if (idxExtendToRight > idxRight)
rightEnd = true;
}
UpdateMaximumResult(inRangeSum * inRangeMin);
}
Process_OptimizeRecursive(idxLeft, idxDividePoint);
Process_OptimizeRecursive(idxDividePoint+1, idxRight);
}
}
void Process_Optimize()
{
Process_OptimizeRecursive(0, g_ValuesNum - 1);
}
void Input()
{
std::cin>>g_ValuesNum;
for(int count=0; count<g_ValuesNum; ++count)
std::cin>>g_Values[count];
}
int main()
{
Input();
Process_Optimize();
std::cout << g_MaximumResult ;
return 0;
}