代码块的末行,如大括号{}内最后一行。
https://atcoder.jp/contests/abc165/tasks/abc165_f
输入 n (2≤n≤2e5) 和长为 n 的数组 a (1≤a[i]≤1e9),表示每个节点的点权。
然后输入一棵树的 n-1 条边(节点编号从 1 开始)。
输出 n 个数,第 i 个数为从节点 1 到节点 i 的路径上点权的 LIS 长度。
注:LIS 指最长上升子序列。
输入
10
1 2 5 3 4 6 7 3 2 4
1 2
2 3
3 4
4 5
3 6
6 7
1 8
8 9
9 10
输出
1
2
3
3
4
4
5
2
2
3
这是一道atc上的题,题意比较清楚,写个DFS在路径上跑LIS即可。
let mut dp: Vec = vec![0; 0]; let mut g = vec![Vec::new(); n]; 这里省略了g的类型声明。Cargo.toml: [dependencies]
proconio = "0.4.2"
main.rs:use proconio::input;
input! {
n:usize,
a:[usize;n],
es:[(usize,usize);n-1]
}
use itertools::Itertools;这个库,注意加Cargo.toml:itertools = "0.10.0"println!("{}", ans.iter().join("\n"));use superslice::Ext;,Cargo.toml:superslice = "1.0.0";, main.rs:p = dp.lower_bound(&x); fn dfs(
u: usize, // 当前节点
fa: usize, // 父节点
g: &Vec<Vec<usize>>, // 图
dp: &mut Vec<usize>, // dp
ans: &mut Vec<usize>, // 答案
a: &Vec<usize>, // 点权
) {}
&mut Vec。dfs(0, 2000000, &g, &mut dp, &mut ans, &a);
dfs(v, u, g, dp, ans, a);
std::mem::swap(&mut x,&mut dp[p]);这个方法,它不会初始化双方的绑定。/***
https://atcoder.jp/contests/abc165/tasks/abc165_f
输入 n (2≤n≤2e5) 和长为 n 的数组 a (1≤a[i]≤1e9),表示每个节点的点权。
然后输入一棵树的 n-1 条边(节点编号从 1 开始)。
输出 n 个数,第 i 个数为从节点 1 到节点 i 的路径上点权的 LIS 长度。
注:LIS 指最长上升子序列。
输入
10
1 2 5 3 4 6 7 3 2 4
1 2
2 3
3 4
4 5
3 6
6 7
1 8
8 9
9 10
输出
1
2
3
3
4
4
5
2
2
3
*/
use proconio::input;
// use std::collections::VecDeque;
//
use itertools::Itertools;
// use petgraph::{Graph, data::Build};
use superslice::Ext;
const MOD:usize = 1000000000+7;
const INF:usize = 1<<60;
fn main() {
input!{
n:usize,
a:[usize;n],
es:[(usize,usize);n-1]
}
let mut g = vec![Vec::new();n];
for (u,v) in es {
g[u-1].push(v-1);
g[v-1].push(u-1);
}
let mut dp:Vec<usize> = vec![0;0];
// let mut dp:Vec = vec![INF;n];
fn dfs(
u:usize,
fa:usize,
g:&Vec<Vec<usize> >,
dp: &mut Vec<usize>,
ans:&mut Vec<usize>,
a: &Vec<usize>
){
let mut x = a[u];
let p ;
if dp.len() == 0 || x>dp[dp.len()-1] {
dp.push(x);
p = a.len();
}
else {
p = dp.lower_bound(&x);
// let t = x;
// x = dp[p];
// dp[p] = t;
std::mem::swap(&mut x,&mut dp[p]);
}
// ans[u] = dp.lower_bound(&INF);
ans[u] = dp.len();;
for &v in g[u].iter(){
if v != fa{
dfs(v,u,g,dp,ans,a);
}
}
if p == a.len() {
dp.pop();
}
else {
dp[p] = x;
}
}
let mut ans = vec![1usize;n];
dfs(0,2000000,&g,&mut dp,&mut ans,&a);
// for v in ans {
// println!("{}",v)
// }
println!("{}", ans.iter().join("\n"));
}