blog.bouzuya.net

2024-01-31 firestore-structured-query 0.3.0 / めんたいこの歌 / ABC218 E

bouzuya/firestore-structured-query 0.3.0 をつくった。

unary filter に対応した。

いまは↓のような感じ。

use firestore_structured_query::{
    FieldPath, FieldPathFilterExt as _, FieldPathOrderExt as _, Filter,
};
use google_api_proto::google::firestore::v1::StructuredQuery;

let _ = StructuredQuery {
    select: None,
    from: vec![],
    r#where: Some(
        Filter::and([
            // field filters
            FieldPath::raw("field1").less_than(&1)?,
            FieldPath::raw("field2").less_than_or_equal(&2)?,
            FieldPath::raw("field3").greater_than(&3)?,
            FieldPath::raw("field4").greater_than_or_equal(&4)?,
            FieldPath::raw("field5").equal(&5)?,
            FieldPath::raw("field6").not_equal(&6)?,
            FieldPath::raw("field7").array_contains(&7)?,
            FieldPath::raw("field8").r#in(&[8])?,
            FieldPath::raw("field9").array_contains_any(&[9])?,
            FieldPath::raw("field10").not_in(&[10])?,
            // unary filters
            FieldPath::raw("field11").is_nan()?,
            FieldPath::raw("field12").is_not_nan()?,
            FieldPath::raw("field13").is_not_null()?,
            FieldPath::raw("field14").is_null()?,
            // composite filters
            Filter::and([
                FieldPath::raw("f").equal(&"a")?,
                FieldPath::raw("f").equal(&"b")?,
            ]),
            Filter::or([
                FieldPath::raw("f").equal(&"a")?,
                FieldPath::raw("f").equal(&"b")?,
            ]),
        ])
        .into(),
    ),
    order_by: vec![
        FieldPath::raw("field1").ascending(),
        FieldPath::raw("field2").descending(),
    ],
    start_at: None,
    end_at: None,
    offset: 0_i32,
    limit: None,
};

ドキュメントコメントは未対応。次は StructuredQuery のビルダーを追加する。


Firestore の Collection Group クエリを使うといろいろな階層における同一 collection_id をまとめて取得できるのだけど、誤爆することがあるので collection_id はなるべく重ならないように設計しておくのが吉。


下の子はめんたいこの歌を歌っている。保育所の友達がめんたいパークに行ってきたらしい。保育所でそこで流れていた音楽を流した結果覚えたのだろう。

上の子は数字の 5 がひっくり返らなくなってきた。今月はずっと 5 や 6 が左右反転していたのだけどおさまってきた。 3 歳ごろの急成長とは違うがじわじわと成長している。


ABC218 : AtCoder Beginner Contest 218

  • E - Destruction https://atcoder.jp/contests/abc218/tasks/abc218_e
    • 提出: https://atcoder.jp/contests/abc218/submissions/49842245
    • 雑にクラスカル法じゃんと思って書いたら 1WA
    • 負の重みの辺は取り除きたくない&非負の重みの辺は取り除きたい
    • つまり重みの大きい辺から取り除く
    • 取り除くのは難しいので、逆に重みの小さい辺だけを残す (連結する) ことを考える
    • クラスカル法っぽく重みの小さい辺から Dsu (Union-Find) を使っていく
    • 求めたいのは取り除いた量なので、事前に重みの総和を求めて、そこから連結に使用した辺を除けばよい
    • WA の原因になったのは、既に連結済みの場合の負の辺の扱いで、最初は連結済みならすべて取り除いていたのだけど、負の辺に関しては連結済みでも残しておけば良かった
use ac_library::Dsu;
use proconio::{input, marker::Usize1};

fn main() {
    input! {
        n: usize,
        m: usize,
        mut abc: [(Usize1, Usize1, i64); m]
    };

    abc.sort_by_key(|&(_, _, c)| c);

    let mut ans = abc.iter().copied().map(|(_, _, c)| c).sum::<i64>();
    let mut dsu = Dsu::new(n);
    for (a, b, c) in abc {
        if dsu.same(a, b) {
            if c < 0 {
                ans -= c;
            }
            continue;
        }
        dsu.merge(a, b);
        ans -= c;
    }

    println!("{}", ans);
}

今日のコミット。