题目大意
给出一个长度为
n
n
n的数组
a
1
,
a
2
,
⋯
,
a
n
a_1,a_2,\cdots,a_n
a1,a2,⋯,an,
求最大的
max
{
a
l
,
a
l
+
1
,
⋯
,
a
r
}
×
min
{
a
l
,
a
l
+
1
,
⋯
,
a
r
}
\max\{a_l,a_{l+1},\cdots,a_r\}\times\min\{a_l,a_{l+1},\cdots,a_r\}
max{al,al+1,⋯,ar}×min{al,al+1,⋯,ar}
时间限制
1s
数据范围
2 ≤ n ≤ 1 0 5 2\le n \le10^5 2≤n≤105
题解
不能发现最大值只会出现在相邻两个之中。
不妨假设
a
,
b
a,b
a,b相邻,且
a
>
b
a>b
a>b,此时的答案就是
a
×
b
a\times b
a×b
现在假设加入一个
c
c
c。
- c > a c>a c>a, c c c与 a a a相邻,如果计算 a , b , c a,b,c a,b,c三个数,则答案为 c × b > a × b c\times b > a \times b c×b>a×b。看上去好像有点问题,但不难发现,因为 a a a, c c c相邻,故更优的答案 a × c a\times c a×c已经统计了,因此 c × b > c × b > a × b c\times b>c\times b > a \times b c×b>c×b>a×b。
- c > a c>a c>a, c c c与 b b b相邻,则 a , b , c a,b,c a,b,c的答案就是 b × c b\times c b×c,因为 b , c b,c b,c相邻,所以此答案也被统计过了。
- a > c > b a>c>b a>c>b, c c c与 a a a相邻,则 a , b , c a,b,c a,b,c的答案还是 a × b a\times b a×b,答案此时仍存在更优的答案 a × c a\times c a×c。
- a > b > c a>b>c a>b>c, c c c与 b b b相邻,则 a , b , c a,b,c a,b,c的答案还是 a × b a\times b a×b,这个答案已经在 a , b a,b a,b相邻的时候统计过了。
- c < b < a c<b<a c<b<a,无论 c c c在哪里,都将使 a , b , c a,b,c a,b,c答案变小,均没有 a × b a\times b a×b优。
综上,可以直到,判断相邻的就可以得出答案。
Code
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <map>
#define ll long long
#define G getchar
using namespace std;
int read()
{
char ch;
for(ch = G();ch < '0' || ch > '9';ch = G());
int n = 0;
for(;'0' <= ch && ch <= '9';ch = G())n = (n<<1)+(n<<3)+ch-48;
return n;
}
void write(int x)
{
if (x > 9)
{
write(x / 10);
putchar(x % 10 + 48);
}
else putchar(x + 48);
}
const int N = 100005;
const int mo = 998244353;
int n , a[N];
ll ans;
int main()
{
//freopen("i.in","r",stdin);
//freopen("e.out","w",stdout);
for (int T = read() ; T ; T--)
{
n = read();
for (int i = 0 ; i < n ; i++)
a[i] = read();
ans = 0;
for (int i = 1 ; i < n ; i++)
ans = max(ans , (ll) a[i] * a[i - 1]);
printf("%lld\n", ans);
}
return 0;
}