题意就是从第i个人往i+1,i+2...看连续的比h[i]小的数有多少个,那么sum就加上这些数的个数。
注意点就是最后的结果可能会超int,所以用__int64
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 80010
int h[MAXN];
int dq_back[MAXN];
int Right[MAXN];
int n;
void cal_Right() {
int front=0;
int tail=1;
dq_back[0]=n+1;
for(int i=n; i>=1; i--) {
while(front<tail&&h[i]>h[dq_back[tail-1]]) {
tail--;
}
Right[i]=dq_back[tail-1]-i-1;
dq_back[tail++]=i;
}
}
int main() {
while(~scanf("%d",&n)) {
for(int i=1; i<=n; i++) {
scanf("%d",&h[i]);
}
h[n+1]=1999999999;
cal_Right();
__int64 ans=0;
for(int i=1; i<=n; i++) {
ans+=Right[i];
//printf("%d\n",Right[i]);
}
printf("%I64d\n",ans);
}
return 0;
}