1272 最大距離 【單調棧】
阿新 • • 發佈:2019-02-18
基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級演算法題
給出一個長度為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
思路:
用單調棧維護點對的左端點,考慮到後面如果有值比前面的值大,那麼就不需要加入到棧內,因為不是最優的。需要在棧中找到最前面的一個小於等於它的點,更新ans。那麼棧內的元素就是一個單調遞減的序列的下標。
程式碼:
#include<bits/stdc++.h> using namespace std; #define MAXN 50005 #define ll long long #define inf 0x3f3f3f3f3f3f3f3f int n,a[MAXN],que[MAXN]; int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); int head=0,tail=0,ans=0; for(int i=0;i<n;i++) { if(tail==0 || a[i]<a[que[tail-1]]) que[tail++]=i; else { for(int j=0;j<tail;j++) { if(a[que[j]]<=a[i]) { ans=max(ans,i-que[j]); break; } } } } printf("%d\n",ans); return 0; }