51nod 5172(單調棧/思維)
阿新 • • 發佈:2019-02-17
收藏
關注
給出一個長度為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
Output
第1行:1個數N,表示陣列的長度(2 <= N <= 50000)。 第2 - N + 1行:每行1個數,對應陣列元素Ai(1 <= Ai <= 10^9)。
輸出最大距離。Input示例
6 5 3 6 3 4 2Output示例
3
思路:
首先我們按照數值從小到大排序,因為我們找的數對是一小一大的,並且一個在前,一個在後,因為此時已經保證數值的單調遞增了, 那麼我們只要保證其兩個位子是小值在前即可。
那麼我們接下來不斷的維護位子即可,具體參考程式碼;
const int maxn=5e4+10; struct node { int val,pos; bool operator<(const node & t)const { if(val!=t.val)return val<t.val; return pos<t.pos; } }a[maxn]; int main() { ios::sync_with_stdio(false); int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i].val; a[i].pos=i; } sort(a,a+n); int ans=0; int tmp=a[0].pos; for(int i=1;i<n;i++) if(a[i].pos>tmp) ans=max(ans,a[i].pos-tmp); else tmp=a[i].pos; cout<<ans<<endl; return 0; }