1617:PIPI学飞行(PIPIPOJ)
题目描述
有n+1个柱子排成一排,每个柱子间距为100米,第n+1个柱子高100000米,PIPI初始时会在第1~n中的某一个柱子上。
他有着最新的飞行器,可以向右水平飞行,当遇到更高的柱子时就会停下来,请问PIPI最远能飞行多少米?
输入
多组输入。
第一行输入柱子的数量n(1<=n<=1e5)。
第二行输入n个正整数,代表这一排柱子的高度(柱子高度小于100000)。
输出
对于每组输入,输出从1~n各个位置出发能飞行的最远距离。
样例输入
5
1 3 2 5 4
样例输出
100 200 100 200 100
题解1(C++版本)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int INF = 1e5;
int n, a[N], res[N];
stack<int> st;
int main(){
while(~scanf("%d", &n)){
memset(res, 0, sizeof res);
for(int i = 1; i <= n;i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++){
while(!st.empty() && a[st.top()] < a[i]) { // 维护一个单调递减栈
res[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
while(!st.empty()){ // 右边没有比自己高的
res[st.top()] = n - st.top() + 1;
st.pop();
}
for(int i = 1; i <= n; i++){
printf("%d ", res[i] * 100);
}
printf("\n");
}
return 0;
}