一开始就陷入误区了,因为总是想着这头牛能看到几头牛这个点去考虑,然而那样的话基本都会爆的但是又想不出怎么优化,网上的题解。从另一方面考虑就好了,就是这一头牛能被多少头牛看到再加上栈的应用就ok了。
-------------------------------------------------------------------------------
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<deque>#include<stack>using namespace std;#define ll long long const int nmax=80005;ll n,a[nmax];stack<ll>q;int main(){ scanf("%lld",&n); for(ll i=1;i<=n;i++) scanf("%lld",&a[i]); q.push(a[1]); ll ans=0,cur=1; for(ll i=2;i<=n;i++){ if(a[i]>=q.top()){ while(!q.empty()&&a[i]>=q.top()){ q.pop(); cur--; } q.push(a[i]); ans+=cur; cur++; } else{ ans+=cur; q.push(a[i]); cur++; } } printf("%lld\n",ans); return 0;}
-----------------------------------------------------------------------------------