题目链接
题目大意
给你一颗树,求顶点1到其他所有顶点的最长上升子序列
题目思路
我本来以为是lca什么的,就感觉写不出,结果就是dfs就行了,然后回溯一下,和普通的最长上升子序列没太大的区别
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e5+5;
int n,a[maxn],head[maxn],cnt,dp[maxn],ans[maxn];
struct node{
int to,next;
}e[maxn<<1];
void add(int u,int v){
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int son,int fa){
int pos=lower_bound(dp+1,dp+1+n,a[son])-dp;
int temp=dp[pos];//记录原先的值
dp[pos]=a[son];
ans[son]=max(ans[fa],pos);//这个不要忘
for(int i=head[son];i;i=e[i].next){
if(e[i].to!=fa){
dfs(e[i].to,son);
}
}
dp[pos]=temp;//回溯
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1,u,v;i<=n-1;i++){
scanf("%d %d",&u,&v);
add(u,v),add(v,u);
}
memset(dp,0x3f,sizeof(dp));
dfs(1,0);
for(int i=1;i<=n;i++){
printf("%d\n",ans[i]);
}
return 0;
}