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