1. 程式人生 > >51nod 5172(單調棧/思維)

51nod 5172(單調棧/思維)

 收藏  關注 給出一個長度為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

思路:

首先我們按照數值從小到大排序,因為我們找的數對是一小一大的,並且一個在前,一個在後,因為此時已經保證數值的單調遞增了, 那麼我們只要保證其兩個位子是小值在前即可。

那麼我們接下來不斷的維護位子即可,具體參考程式碼;


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;
}