线段树优化LIS求调
查看原帖
线段树优化LIS求调
593299
Revdream楼主2024/9/13 14:05

rt,WA on #2

代码:

#include<bits/stdc++.h>

using namespace std;

int n;
int a[100010];
int b[100010];
int vis[100010];
int tree[400010];
int f[100010];
int ans;

int query(int o,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return tree[o];
	}
	int mid=(l+r)/2;
	int lmax=-1e9,rmax=-1e9;
	if(mid>=x){
		lmax=query(o*2,l,mid,x,y);
	}
	if(mid+1<=y){
		rmax=query(o*2+1,mid+1,r,x,y);
	}
	return max(lmax,rmax);
}

void cha(int o,int l,int r,int ll,int rr,int k){
	if(ll<=l&&r<=rr){
		tree[o]=max(tree[o],k);
		return;
	}
	int mid=(l+r)/2;
	if(ll<=mid){
		cha(o*2,l,mid,ll,rr,k);
	}
	if(rr>mid){
		cha(o*2+1,mid+1,r,ll,rr,k);
	}
	tree[o]=max(tree[o*2],tree[o*2+1]);
}

signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		vis[a[i]]=i;
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&b[i]);
		b[i]=vis[b[i]];
	}
	for(int i=1;i<=n;i++){
		f[i]=max(f[i],query(1,0,n,1,b[i]-1)+1);
		cha(1,0,n,b[i],b[i],f[i]);
		ans=max(f[i],ans);
	}
	printf("%d",ans);
	return 0;
}
2024/9/13 14:05
加载中...