CF 189 div2 D

来源:互联网 发布:linux c 调用so动态库 编辑:程序博客网 时间:2024/05/01 18:11
D. Psychos in a Line
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

There are n psychos standing in a line. Each psycho is assigned a unique integer from1 to n. At each step every psycho who has an id greater than the psycho to his right (if exists) kills his right neighbor in the line. Note that a psycho might kill and get killed at the same step.

You're given the initial arrangement of the psychos in the line. Calculate how many steps are needed to the moment of time such, that nobody kills his neighbor after that moment. Look notes to understand the statement more precise.

Input

The first line of input contains integer n denoting the number of psychos,(1 ≤ n ≤ 105). In the second line there will be a list ofn space separated distinct integers each in range1 to n, inclusive — ids of the psychos in the line from left to right.

Output

Print the number of steps, so that the line remains the same afterward.

Sample test(s)
Input
1010 9 7 8 6 5 3 4 2 1
Output
2
Input
61 2 3 4 5 6
Output
0
Note

In the first sample line of the psychos transforms as follows: [10 9 7 8 6 5 3 4 2 1] →  [10 8 4] →  [10]. So, there are two steps.

这道题突破点在,能够删除后面元素的数字,一定是开始时比后面一个元素大的那些元素,这样我们可以用一个队列保存下模拟过程中比后面一个元素大的那些元素。由于需要删除元素,所以用一个next数组模拟链表,这样就导致一个问题,必须从后面倒着开始删除元素,否则next指向是错误的,让开始时入队的顺序倒着来就可以了。
#include <iostream>#include <cstdio>#include <cstring>#include <cstdio>#include <cstdlib>#include <map>#include <set>#include <vector>#include <queue>#include <stack>#include <algorithm>#include <list>using namespace std;typedef long long LL;typedef pair<int,int> P;const int maxn = 100000 + 5;const int INF = 1000000000;queue<P> Q;int next[maxn];int num[maxn];int main(){    int n;    while(cin >> n){        while(!Q.empty())  Q.pop();        for(int i = 0;i < n;i++){            cin >> num[i];            next[i] = i+1;        }        for(int i = n-2;i >= 0;i--){            if(num[i] > num[i+1]) Q.push(P(i,0));        }        int ans = 0;        while(!Q.empty()){            int pos = Q.front().first;            int round = Q.front().second;            ans = max(ans,round);            Q.pop();            if(next[pos] != n && num[pos] > num[next[pos]]){                next[pos] = next[next[pos]];                Q.push(P(pos,round+1));            }        }        cout << ans << endl;    }    return 0;}

原创粉丝点击