做题记录整理栈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;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号