51nod 1272单调栈最大距离

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1272单调栈最大距离相关的知识,希望对你有一定的参考价值。

最大距离

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

解题思路

按照大小排序并保留原本的位置
从小到大依次维护递增单调栈

  1. 因为大小排了序,所以单调栈里的数都会比当前位小
  2. 单调栈里维护的是原本的位置,那么前面越小,离当前位越远

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单调栈最大距离的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1102 面积最大的矩形(单调栈)

51nod 1272 最大距离

51nod 1272 最大距离

51nod 1272 最大距离 O(nlog(n)) , 快排 , 最大连续子串

51nod 1102 面积最大的矩形 (单调栈)

51nod 1423 最大二“货” 单调栈