51nod 1272单调栈最大距离
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1272单调栈最大距离相关的知识,希望对你有一定的参考价值。
题目
给出一个长度为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。
输入
第1行:1个数N,表示数组的长度(2 <= N <= 50000)。
第2 ~ N+1行:每行1个数,对应数组元素Ai(1 <= Ai <= 10^9)。
输出
输出最大距离。
输入样例
6
5
3
6
3
4
2
输出样例
3
解题思路
按照大小排序并保留原本的位置
从小到大依次维护递增单调栈
- 因为大小排了序,所以单调栈里的数都会比当前位小
- 单调栈里维护的是原本的位置,那么前面越小,离当前位越远
Code
#include <bits/stdc++.h>
#define N 50000
using namespace std;
struct DT
int x, id;
a[N + 200];
int n, top, ans, q[N + 200];
bool cmp(const DT&k, const DT&l)
if(k.x == l.x) return (k.id < l.id);
return k.x < l.x;
int main()
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i].x);
a[i].id = i;
sort(a + 1, a + 1 + n, cmp);
for(int i = 1; i <= n; i ++)
while(top && a[q[top]].id > a[i].id) top --;
q[++ top] = i;
ans = max(ans, a[i].id - a[q[1]].id);
printf("%d", ans);
以上是关于51nod 1272单调栈最大距离的主要内容,如果未能解决你的问题,请参考以下文章