洛谷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 }

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

posted @ 2022-04-16 08:01  YHXo  阅读(55)  评论(0编辑  收藏  举报