ATB165F LIS on Tree I 学习笔记
ATB165F LIS on Tree I 学习笔记
题意简述
给定一棵 \(n\) 个结点,以 \(1\) 为根的树。每个点 \(u\) 有一个权值 \(a_i\)。试对于每个结点 \(i\) 求出 \(1\to i\) 路径上的LIS长度。
做法解析
就是把原来序列上那个DP搬到树上,多了个回溯的过程,没了。详情见代码。
代码实现
#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=2e5+5;
int N,A[MaxN],X,Y,dp[MaxN],ans[MaxN];
vector<int> Tr[MaxN];
void addudge(int u,int v){
    Tr[u].push_back(v);
    Tr[v].push_back(u);
}
void dfs(int u,int f){
    int p=1,pval;
    if(!f)dp[1]=A[u],ans[1]=1;
    else{
        p=lwberi(dp,ans[f],A[u]);
        pval=dp[p],dp[p]=A[u];
        ans[u]=ans[f]+(p>ans[f]);
    }
    for(int v : Tr[u])if(v!=f)dfs(v,u);
    dp[p]=pval;
}
int main(){
    readi(N);
    for(int i=1;i<=N;i++)readi(A[i]);
    for(int i=1;i<N;i++)readis(X,Y),addudge(X,Y);
    dfs(1,0);for(int i=1;i<=N;i++)writil(ans[i]);
    return 0;
}
                    
                
                
            
        
浙公网安备 33010602011771号