ABC038 : AtCoder Beginner Contest 038 の A, B, C, D を解いた。
- A - お茶
https://atcoder.jp/contests/abc038/tasks/abc038_a
- 提出: https://atcoder.jp/contests/abc038/submissions/38137464
s.ends_with('T')
- B - ディスプレイ
https://atcoder.jp/contests/abc038/tasks/abc038_b
- 提出: https://atcoder.jp/contests/abc038/submissions/38137514
h1 == h2 || h1 == w2 || w1 == h2 || w1 == w2
- C - 単調増加
https://atcoder.jp/contests/abc038/tasks/abc038_c
- 提出: https://atcoder.jp/contests/abc038/submissions/38137664
l == r
で各要素に 1 通りずつl < r
は単調増加する箇所ごとに x choose 2 通りずつ。 x は単調増加する箇所の長さ- 足したものが答えになる
- D - プレゼント
https://atcoder.jp/contests/abc038/tasks/abc038_d
- 提出: https://atcoder.jp/contests/abc038/submissions/38138352
- ひとまずすべての w, h が異なるものとして考える
- とりあえず w の昇順に並べる
- 先頭から走査して、ある箱を使う場合は、それまでの結果のうち h 未満で最大の個数 + 1 になる
dp[h] := 高さ h における最大の個数
として順に更新していく- 区間の最大を求めるためにセグメント木 or BIT (FenwickTree) を使う
- 最後に全体で最大を求めれば答えになる
- 次に w, h に同じものが含まれる状況を考える
- w が同じ場合は h が昇順になってしまうと、同じ w に対して複数の h を使ってしまうことになる (dp で同じ範囲を対象に更新をかけてしまう)
- w の昇順 h の降順にしておけば問題ない
use std::cmp::Reverse; use proconio::input; use segtree::*; fn main() { input! { n: usize, mut wh: [(usize, usize); n], }; wh.sort_by_key(|&(w, h)| (w, Reverse(h))); let mut st = Segtree::<Max<usize>>::new(100_000 + 1); for (_, h) in wh.into_iter() { st.set(h, st.prod(0, h) + 1); } let ans = st.all_prod(); println!("{}", ans); } // segtree
今日のコミット。