其他分享
首页 > 其他分享> > 洛谷P2866 [USACO06NOV]Bad Hair Day S (单调栈)

洛谷P2866 [USACO06NOV]Bad Hair Day S (单调栈)

作者:互联网

看到这道题很容易想到单调栈,但我一开始想的是从后往前扫,但发现会有问题(因为这样会对后面牛的答案造成影响),所以这时我们要及时换一个思路,从前往后扫。

维护一个单调递减的栈,插入h[i]时,小等于它的数都要出栈,累加栈中元素数量,表示的意义就是:当前栈中的牛都是可以看到i这头牛的,即他们不会被i这头牛挡住。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long ans,h[80010];
 4 int s[80010],top,n;
 5 
 6 int main(){
 7     cin>>n;
 8     for(int i=1;i<=n;i++) cin>>h[i];
 9     for(int i=1;i<=n;i++){
10         while(top!=0 && h[i]>=h[s[top]]) top--;
11         ans+=top;
12         s[++top]=i;
13     }
14     cout<<ans;
15     return 0;
16 }

一种思路不行时,要马上换一种思路。。。

标签:洛谷,int,top,long,Hair,Bad,80010,ans,单调
来源: https://www.cnblogs.com/yhxnoerror/p/16151781.html