注意一点:当高度相同时,看不到前面的。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<vector>
using namespace std;
const int maxn=80010;
long long height[maxn];
long long dis[maxn];
int N;
long long get_sum(int N)
{
long long ans=0;
int i;
vector<long long >R(2*N,0);
height[0]=-1;
height[N+1]=1000000100;
for(i=0; i<=N; i++)
R[i]=i;
for(i=N; i>=1; i--)
while(height[i]>height[R[i]+1])
{
R[i]=R[R[i]+1];
}
for(i=1; i<=N; i++)
{
ans+=(R[i]-i);
}
return ans;
}
int main()
{
int i;
while(scanf("%d",&N)!=EOF)
{
memset(height,0,sizeof(height));
for(i=1; i<=N; i++)
{
scanf("%I64d",&height[i]);
}
printf("%I64d\n",get_sum(N));
}
return 0;
}