一些農民約翰的N頭牛(1≤N≤80,000)頭髮不好!由於每頭母牛都對自己的髮型很敏感,因此FJ想要計算能夠看到其他母牛頭頂的其他母牛的數量。
每頭牛都有一個特定的高度hi(1≤hi≤1,000,000,000),站在一排朝東的牛羣中。因此,只要這些奶牛嚴格比奶牛矮,i就可以看到奶牛頭頂上的奶牛(即母牛i + 1,i + 2等等)。
考慮每個點對答案的貢獻。
設他右邊比他高的第一個點爲k,點i對答案的貢獻爲 k-i-1。
答案即爲求
找到他右邊第一個比他高的點,我們倒序就變成了找左邊比他高的點,維護單調下降的單調棧即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
const int INF=2147483647;
int top=0,n;
struct data{
int val,tim;
data(int a=0,int b=0){
val=a,tim=b;
}
}sta[MAXN];
int a[MAXN],pos[MAXN];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
a[n+1]=INF;
for(int i=n+1;i>=1;i--){
data tem(a[i],i);
while(top&&sta[top].val<tem.val){
top--;
}
pos[i]=sta[top].tim;
sta[++top]=tem;
}
long long ans=0;
for(int i=1;i<=n;i++)ans+=pos[i]-i-1;
printf("%lld\n",ans);
}