您的位置:首页 > 其它

CF 189 div2 D

2013-06-24 14:57 381 查看
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 from
1 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 of
n space separated distinct integers each in range
1 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
10
10 9 7 8 6 5 3 4 2 1


Output
2


Input
6
1 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: