02Ljh @ 2022-12-11 14:16:25
emm 先把问题转换为LIS 然后思路是用set二分求LIS 结果WA 20pts 求调
思路同这题的set二分 是不是做法假了
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100019
#define INF 0x3f3f3f3f
#define WA puts("CCF");
int b[MAXN];
int mapp[MAXN];
int dp[MAXN];
int n;
struct lxy
{
int pos,val;
bool operator <(const lxy &x)const
{
if(x.val==val) return x.pos<pos;
return x.val<val;
}
};
set<lxy> q;
set<lxy>::iterator r;
void pu(int pos_,int val_)
{
lxy temp;
temp.pos=pos_;
temp.val=val_;
q.insert(temp);
return ;
}
int main()
{
//freopen("P1439_4.in","r",stdin);
cin>>n;
for(int i=1;i<=n;i++)
{
int l;
cin>>l;
mapp[l]=i;
}
bool flag=false;
for(int i=1;i<=n;i++)
{
int l;
cin>>l;
b[i]=mapp[l];
//cout<<b[i]<<" ";
if(b[i]!=i) flag=true;
}
if(!flag)
{
cout<<n;
return 0;
}
int ans=0;
for(int i=1;i<=n;i++)
{
//cout<<ans<<"\n";
dp[i]=1;
if(q.empty()) { ans=max(ans,1); pu(i,b[i]); continue; }
lxy temp;
temp.pos=i;
temp.val=b[i];
r=q.lower_bound(temp);
while(1)
{
temp=*r;
if(temp.val>b[i]) --r;
else break;
}
int need=temp.val,max1=0;
while(need==temp.val)
{
//cout<<need<<"=="<<temp.val<<"->"<<temp.pos<<"\n";
max1=max(dp[temp.pos],max1);
if(temp.pos==1) { break; }
--r;
temp=*r;
}
max1=max(max1,dp[temp.pos]);
dp[i]=max1+1;
ans=max(ans,dp[i]);
pu(i,b[i]);
}
//for(int i=1)
cout<<ans;
/*
dp[i]
*/
return 0;
}
/*
84751352
*/