萌新求调树上LIS
查看原帖
萌新求调树上LIS
247269
MSqwq楼主2022/10/5 22:11
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;

inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
	return x*f;
}
const int N=2e4+10;
struct qwq{
	int to,ne;
}t[N];
int elast[N],num;
void add(int from,int to)
{
	t[++num]={to,elast[from]};
	elast[from]=num;
}

int n;
int a[N];
int f[N],len;
void dfs(int x,int fa)
{
	if(a[x]>f[len])f[++len]=a[x];
	else
	{
		int pos=lower_bound(f+1,f+1+n,a[x])-f;
		f[pos]=a[x];
	}		
	
	for(int i=elast[x];i;i=t[i].ne)
		if(t[i].to!=fa)dfs(t[i].to,x);
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<n;i++)
	{
		int x=read(),y=read();
		add(x,y),add(y,x);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		memset(f,0,sizeof(f)),len=0;
		dfs(i,0),ans=max(ans,len);
	}
	printf("%d\n",ans);
	return 0;
}

2022/10/5 22:11
加载中...