http://codeforces.com/contest/319

B题
从右往左扫,同时维护一个单调栈。
每个位置记录到此位置需要的步数,最后求个最大值。
也可以排序+并查集搞搞。

#include<cstdio>
#include<algorithm>
using namespace std;

int a[100005], step[100005], st[100005];

int main()
{
    int n, top = 0, i, t;
    scanf("%d", &n);
    for (i = 0; i < n; i++) scanf("%d", &a[i]);
    for (i = n - 1; i >= 0; i--)
    {
        t = 0;
        while (top && a[st[top - 1]] < a[i])
            step[i] = t = max(t + 1, step[st[--top]]);
        st[top++] = i;
    }
    printf("%d", *max_element(step, step + n));
}

Comments

comments powered by Disqus