3250 -- Bad Hair Day (poj.org)http://poj.org/problem?id=3250题意:一群牛排成一排,牛a 向右看能比他身高小的牛,直到一头身高比 牛a 高的牛挡住 牛a的视野,求 牛0 到 牛n-1 中 每头牛能看到其他牛的总数。
思路:单调栈;
将这个栈维护成从栈底至栈顶严格单调递减;
下面由样例举例;
一共有6头牛;
这六头牛的身高从左到右分别为: 10、3、7、4、12、2;
序号 | 0 | 1 | 2 | 3 | 4 | 5 |
身高 | 10 | 3 | 7 | 4 | 12 | 2 |
首先身高为10的牛的下标进栈,3小于10,身高为3的牛的下标进栈;
牛的下标 | 0 | 1 | ||
这头牛的身高 | 10 | 3 |
然后7大于3,这代表身高为3的牛的视野被身高为7的牛挡住了;
于是身高为3的牛弹出,身高为3的牛 能看到 (身高为7的牛下标-身高为3的牛下标-)-1 个牛,也就是0头牛,身高为3的牛的下标出栈,7小于10,身高为7的牛的下标进栈;
牛的下标 | 0 | 2 | ||
这头牛的身高 | 10 | 7 |
接着4小于7,身高为4的牛的下标进栈;
牛的下标 | 0 | 2 | 3 | |
这头牛的身高 | 10 | 7 | 4 |
之后,身高为12(下标为4)的牛来了;
身高为4的牛看不见了,身高为4的牛 能看到 (身高为12的牛下标-身高为4的牛下标-)-1 个牛,也就是0头牛;
身高为7的牛看不见了,身高为7的牛 能看到 (身高为12的牛下标-身高为7的牛下标-)-1 个牛,也就是1头牛;
身高为10的牛看不见了,身高为10的牛 能看到 (身高为12的牛下标-身高为10的牛下标-)-1 个牛,也就是3头牛;
栈空了,身高为12的牛的下标进栈;
2小于12,身高为2的牛的下标进栈;
牛的下标 | 4 | 5 | ||
这头牛的身高 | 12 | 2 |
这时,牛群到底了;
假设有一头身高无限大的牛来了 下标为n,这里n=6;
身高为2的牛看不见了,身高为2的牛 能看到 (身高为无限大的牛下标-身高为2的牛下标-)-1 个牛,也就是0头牛;
身高为12的牛看不见了,身高为12的牛 能看到 (身高为无限大的牛下标-身高为12的牛下标-)-1 个牛,也就是1头牛;
所以总数是
0+0+1+3+0+1=5;
代码如下:时间限制是2s,最高的牛高1000000000,所以无限要比这个数大。
#include<iostream>
#include<stack>
const int inf=1000000003;
using namespace std;
int a[80010];
stack<int> st;
long long ans=0;
int n;
int main()
{
cin>>n;
for(int i=0; i<n; i++){
cin>>a[i];
}
a[n]=inf;
for(int i=0; i<=n; i++){
while(!st.empty()&&a[st.top()]<=a[i]){
ans+=(i-st.top()-1);
st.pop();
}
st.push(i);
}
cout<<ans;
return 0;
}