Files
CodeTest/baekjoon/가장_긴_증가하는_부분_수열/solution_19931124.rs

59 lines
1.3 KiB
Rust

macro_rules! parse_list {
($t: ty) => ({
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
let list: Vec<$t> = line.split_whitespace()
.map(|w| w.parse::<$t>().unwrap()).collect();
list
})
}
macro_rules! parse_line {
($($t: ty),+) => ({
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
let mut iter = line.split_whitespace();
($(iter.next().unwrap().parse::<$t>().unwrap()),+)
})
}
fn binary_search(min_end: &Vec<u32>, n: u32) -> Option<usize>{
if min_end.len() == 0 {
return None;
}
let (mut l, mut r) : (usize, usize) = (0, min_end.len() - 1);
while l + 1 < r{
let mid = (l + r) / 2;
if n <= min_end[mid]{
r = mid;
}
else{
l = mid;
}
}
if n <= min_end[l]{
return Some(l);
}
else if n <= min_end[r]{
return Some(r);
}
return None;
}
fn main(){
let _n = parse_line!(usize);
let seq = parse_list!(u32);
let mut min_end : Vec<u32> = Vec::new();
for &x in seq.iter(){
match binary_search(&min_end, x){
Some(i) => {min_end[i] = x;},
None => {min_end.push(x);},
}
}
println!("{}", min_end.len());
}