萌新初学OI只拿了50分求助QAQ
查看原帖
萌新初学OI只拿了50分求助QAQ
1053122
shy_lihui楼主2024/11/29 15:30
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5;
int n,a[MAXN+5],b[MAXN+5];
int f[MAXN+5];//f[i] 表示以 b[i] 结尾的 LIS 长度
int g[MAXN+5];//g[i] 表示长度为 i 结尾的 LIS
int rnk[10005];// rnk[i] 表示 i 在 a 数组的排名
int ans=0; 
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin>>b[i];
	}
	for(int i=1;i<=n;i++)
	{
		rnk[a[i]]=i;
	}
	for(int i=1;i<=n;i++)
	{
		g[i]=0;
	}
	rnk[0]=n+1;
	for(int i=1;i<=n;i++)
	{
		int l=1,r=n,len;
		while(l<=r)
		{
			int mid=l+r>>1;
			if(rnk[g[mid]]>=rnk[b[i]])
			{
				len=mid;
				r=mid-1;
			}
			else
			{
				l=mid+1;
			}
		}
		f[i]=len;
		g[len]=b[i];
		ans=max(ans,f[i]);
	}
	cout<<ans;
	return 0;
}
2024/11/29 15:30
加载中...