解法是
枚举每个位置i,找出i右边比第一个比a[i]小的a[j]的位置j
在i到j - 1中间求最大值的位置k 如果a[k] > a[i] 那么更新答案
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
Log[1] = 0;
for(int i = 2; i < MAXN; i++) Log[i] = Log[i >> 1] + 1;
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
rmqinit(n);
int ans = -1;
for(int i = 1; i <= n; i++)
{
int r = bin(i, i + 1, n);
int k = -1;
if(r > i) k = rmqmax(i, r);
if(w[k] > w[i])
ans = max(ans, k - i);
}
if(ans < 1) ans = -1;
printf("%d\n", ans);
}
return 0;
}