kxbb @ 2022-09-11 18:43:32
#include<bits/stdc++.h>
using namespace std;
int const N = 100010;
int main()
{
int en,mid;
int n;
int a[N];
int b[N];
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
for(int j=0;j<n;j++)//离散化
{
if(a[j]==b[i])
{
b[i]=j+1;
break;
}
}
}
int u[N]={};
memset(u,0,sizeof(u));
for(int i=0;i<n;i++)//求最长上升子序列
{
if(!en||u[en]<b[i])
{
en++;
u[en]=b[i];
}
else
{
mid=lower_bound(u+1,u+1+en,b[i])-u;
u[mid]=b[i];
}
// cout<<mid<<" "<<f[i]<<endl;
// for(int i=0;i<=en+3;i++) cout<<u[i]<<" ";
// cout<<endl;
}
cout<<en<<endl;
return 0;
}
60分,思路:离散化然后求最长上升
by Dream_weavers @ 2022-09-11 18:53:34
1.你管这叫离散化?
2.O(n^2) 想过1e5?
by Register_int @ 2022-09-11 18:56:17
@kxbb 有一个办法是把所有 a 的值记录下来,这样就有了线性转化的优秀复杂度,可以通过
by kxbb @ 2022-09-11 18:58:26
@Register_int 啊懵,没听懂
by Register_int @ 2022-09-11 19:00:07
@kxbb 你的程序的目的就是找到 b 在 a里面的位置。那么就可以开一个 1e5 的数字,记录 a 里面每一个数值的对应位置,可以线性查询。
by kxbb @ 2022-09-11 19:01:08
@Register_int 哦,就把前面的修改变成
by Register_int @ 2022-09-11 19:02:06
@kxbb 正确的
by kxbb @ 2022-09-11 19:02:39
@Register_int 谢谢我去改改看
by kxbb @ 2022-09-11 19:08:48
@Register_int ac啦,为表感谢赠送一个关注