做题记录整理栈4 #P1823. [COI2007] Patrik 音乐会的等待(2022/9/15)

#P1823. [COI2007] Patrik 音乐会的等待

这是一个很好的单调栈的运用题

首先我们枚举每个人作为右边的那个人(为了不算重),那么很明显,他能互相看到的人就是[x,i-1],其中x指的是从他开始数左边第一个比他高的人,此时就可以用单调栈处理。

#include<bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
ll n,zhan[5000005],a[5000005];
ll top,ans,tong[5000005];
int main()
{
	cin>>n;
	for1(i,1,n)
	    scanf("%d",&a[i]);
	for1(i,1,n)
	{
		while(top&&a[i]>=a[zhan[top]])
		{
			if(a[i]==a[zhan[top]])
			    tong[i]=tong[zhan[top]]+1;
			ans+=tong[zhan[top--]]+1;
		}
		if(top)
		    ans++;
		zhan[++top]=i;
	}
	cout<<ans;
	return 0;
}
posted @ 2022-09-15 20:20  yyx525jia  阅读(23)  评论(0)    收藏  举报