題目鏈接:Patrik 音樂會的等待
顯然,如果我們從每個人往左計算答案,那麼滿足的序列一定是具有單調性的。
所以我們可以想到用單調棧去維護。
但是我們需要處理相同身高的人,所以我們棧裏面存一個pair
每次先彈出小於的,並且計算答案,然後再判斷當前棧裏面身高是否相等,然後是否爲唯一元素等。注意細節。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e5+10;
int n,top; long long res;
pair<int,int> s[N];
signed main(){
cin>>n;
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
while(top&&s[top].first<x) res+=s[top].second,top--;
if(s[top].first==x){
res+=s[top].second+(top>1);
s[top].second++;
}else{
if(top) res++;
s[++top]={x,1};
}
}
cout<<res;
return 0;
}