很巧妙的题目,一开始自己想麻烦了,后来看了题解说要用栈然后才自己推出来。。。
真的是应该多做一些usaco这种思维性强的题目,这样的话水平会上升到一个新的层次。。
说题。。。
想到用栈然后就不难理解了,用2个long long分别储存栈内的个数还有答案数
很巧妙啊!!。。。。。。
具体看代码
一开始没有用long long结果错了一个点。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
long long n,a[80000+9];
int main()
{
scanf("%lld",&n);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
long long ans=0,num=1;
stack<long long>s;
s.push(a[1]);
for(long long i=2;i<=n;i++)
{
long long now=s.top();
if(a[i]>=now)
{
while(!s.empty()&&a[i]>=s.top())
s.pop(),num--;
ans+=num;
s.push(a[i]);
num++;
}
else
{
ans+=num;
s.push(a[i]);
num++;
}
}
printf("%lld\n",ans);
return 0;
}