bouzuya.hatenablog.com

ぼうずやのにっき

ABC038 を解いた等

ABC038 を解いた。 D でうまくソートしたあと LIS: Longest Increasing Subsequence (最長増加部分列) の長さを求める問題が出ていた (解説では BIT が使われている) 。

末尾と比較して大きければ追加し、そうでないなら次以降のために最適な位置を更新している。計算量を下げるためにここで二分探索を使っている。あまり考えていない。最大個数分だけ確保して INF に初期化しておくと if がなくなるので良いかもしれない。あとで更新するかもしれない。

use superslice::*;
// ...
let a = /* ... */;
let mut l = vec![a[0]];
for a_i in a.iter().skip(1) {
    if a_i > l[l.len() - 1] {
        l.push(a_i);
    } else {
        let i = l.lower_bound(&a_i);
        l[i] = a_i;
    }
}
let res = l.len();

いろいろと家事をこなして避けられないイベントをこなしたらもう夜だ……。 Amazon でドッキングステーションやいくつかの工具や包丁・まな板などを買った。またいくつか書くかもしれない。