F - LIS on Tree

[Q] https://atcoder.jp/contests/abc165/tasks/abc165_f
タイトル通りとは恐れ入った。
dfs + LIS。

DPをdfsごとにvector<ll>でコピーするとTLE。
バックトラックで使いまわす必要があるかも。

Q. LIS?
A. https://atcoder.jp/contests/typical90/tasks/typical90_bh
これをすでにテンプレート化していたので、あてはめるだけ。

ll A[200010];
ll N;
vector<ll> G[200010];
ll ans[200010];
ll DP[200010];

void dfs(ll d, ll pre, ll cnt){
 ll pos = lower_bound(DP, DP+cnt, A[d]) - DP;
 ll preval = DP[pos];
 DP[pos] = A[d]; // バックトラック
 if (pos==cnt) ++cnt;
 ans[d] = cnt;
 for(auto v: G[d]){
   if (v == pre) continue;
   dfs(v, d, cnt);
 }
 DP[pos]=preval; // 復元
}

int main(){
 cincout();
 
 cin >> N;
 vector<ll> DP;
 rep(i, N) cin >> A[i];
 rep(i, N-1){
   ll u, v;
   cin >> u >> v;
   --u, --v;
   G[u].push_back(v);
   G[v].push_back(u);
 }
 dfs(0, -1, 0);
 rep(i, N) cout << ans[i] << endl;
}




この記事が気に入ったらサポートをしてみませんか?