D - 疯狂的企鹅
在鵝廠工作的DJ開始訓練起了鵝廠的企鵝們,現在DJ教小企鵝玩一個瘋狂的游戲(危險游戲,小朋友請勿模仿)。
現在有一排小企鵝,從左到右編號為1....N,每個小企鵝有一個數字,每天早上,如果一個小企鵝發現他右邊的小企鵝的數字比他的小,他就會消滅這個小企鵝。問到了第幾天才會沒有小企鵝可以被消滅,你需要輸出天數-1的值
注:所有小企鵝的數字是1...N的排列
Input
每組數據輸入格式如下:
第一行一個整數N (N<=10^6)
第二行N個整數,表示1...N號小企鵝的數字
Output
每組數據一行,每行一個整數表示輸出天數-1的值
Sample Input
4 4 2 1 3Sample Output
2Hint
對于第一組數據:
DAY1:6 2 3 4 5
DAY2:6 3 4 5
DAY3:6 4 5
DAY4:6 5
DAY5:6
對于第二組數據:
DAY1:6 3 5
DAY2:6 5
DAY3:6
對于第三組數據:
DAY1:6
#include<cstdio> #include<iostream> #include<queue> using namespace std; const int size=1e6+5; int arr[size],last[size],nxt[size]; int del[size]; int main() {int n;while(~scanf("%d",&n)){for(int i=1;i<=n;i++) {scanf("%d",&arr[i]);nxt[i]=i+1;last[i]=i-1;}last[0]=n;nxt[n]=0;nxt[0]=1;del[0]=1;//構建雙向鏈表 queue<int> q,p;for(int i=2;i<=n;i++){if(arr[i]<arr[i-1]){del[i]=1;//將所有第一輪就會被刪除的東西打上標記并入隊 q.push(i);}}int ans=0;while(!q.empty()){ans++;while(!q.empty()){int x=q.front();q.pop();if(last[x]&&nxt[x]&&del[last[x]]!=1&&del[nxt[x]]!=1&&arr[nxt[x]]<arr[last[x]]){p.push(nxt[x]);//被刪除的元素全部入隊 del[nxt[x]]=1;//所有被刪除的打上標記 }nxt[last[x]]=nxt[x];last[nxt[x]]=last[x];//不論如何都將被刪除的元素的前后元素連接起來 }q=p;while(!p.empty()) p.pop();}cout<<ans<<endl;} }?
總結
- 上一篇: java毕业设计项目ssm+mysql实
- 下一篇: 拉绳式位移计用于山体滑坡裂缝中