http://www.lydsy.com/JudgeOnline/problem.php?id=1660
https://www.luogu.org/problem/show?pid=2866
单调栈裸题
入栈时与栈顶元素比较,如果栈顶元素小于等于加入的数那就弹出并且加上栈顶元素能够看到的数目(现加入的数的位置-栈顶元素位置-1),直到达到条件后入栈
全部入栈后最后累加还在栈内元素的答案就好了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct ppap{ll x,y;}s[100001];
int main()
{
ll sum=0,n,ans=0;scanf("%lld",&n);
for(ll i=1;i<=n;i++){
ll x;scanf("%lld",&x);
while(sum&&x>=s[sum].y){
ans+=i-s[sum].x-1;sum--;
}
ppap xx;xx.x=i;xx.y=x;s[++sum]=xx;
}
for(ll i=1;i<=sum;i++)ans+=n-s[i].x;
printf("%lld",ans);
return 0;
}