Patrik 音樂會的等待

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章