给出一个长度为N的整数数组A,对于每一个数组元素,如果他后面存在大于等于该元素的数,则这两个数可以组成一对。每个元素和自己也可以组成一对。例如:{5, 3, 6, 3, 4, 2},可以组成11对,如下(数字为下标):
(0,0), (0, 2), (1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (3, 3), (3, 4), (4, 4), (5, 5)。其中(1, 4)是距离最大的一对,距离为3。
Input
第1行:1个数N,表示数组的长度(2 <= N <= 50000)。
第2 - N + 1行:每行1个数,对应数组元素Ai(1 <= Ai <= 10^9)。
Output
输出最大距离。
Input示例
6
5
3
6
3
4
2
Output示例
3
思路:
维护一个单调递减栈,当出现比栈顶的值大的值时,在栈中找出小于等于这个值的最左边的那个值。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 5e5 + 10;
int input[MAXN];
int N;
int buf[MAXN];
int search(int left, int right, int val)
{
while (left < right - 1)
{
int mid = left + (right - left) / 2;
if (input[buf[mid]] > val)
{
left = mid;
}
else
{
right = mid;
}
}
if (input[buf[left]] <= val)
{
return left;
}
return right;
}
int main(int argc, const char * argv[])
{
cin >> N;
int result = 0;
int index = 0;
cin >> input[0];
buf[0] = 0;
for (int i = 1; i < N; i++)
{
cin >> input[i];
if (input[i] >= input[buf[index]])
{
int pos = search(0, index, input[i]);
result = max(result, i - buf[pos]);
}
else
{
index++;
buf[index] = i;
}
}
cout << result << endl;
return 0;
}