40pts,单调栈做法
查看原帖
40pts,单调栈做法
66964
heyuguo楼主2023/9/28 21:08
#include<bits/stdc++.h>
using namespace std;
long long n,a[100005]={-1},f[100005],s[100005],top=0,ans;//s:栈 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
		f[i]=1;
	memset(s,0x3f,sizeof s);
	s[0]=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]>s[top])
			s[++top]=a[i],f[i]=top;
		else
		{
			long long l=0,r=top+1,mid=(l+r)>>1;
			while(l+1<r)
			{
				if(s[mid]>=a[i])
					r=mid-1;
				else
					l=mid;
				mid=(l+r)>>1;
			}
//			for(int i=1;i<=top;i++)
//			{
//				cout<<s[i]<<' ';
//			}cout<<'\n';
//			cout<<'l'<<l<<'\n';
			f[i]=l+1;
			
			s[l+1]=min(s[l+1],a[i]);
//			for(int i=1;i<=top;i++)
//			{
//				cout<<s[i]<<' ';
//			}cout<<'\n';
//			top=max(top,l+1);
		}
		ans=max(ans,f[i]);
	}
	cout<<ans;
	return 0;
}
2023/9/28 21:08
加载中...