ABC347 C - Ideal Holidays

Untitled

休日開始曜日で全探索。(実際には、予定のある曜日だけを休日開始曜日とすればよい)

または、予定を覆うような曜日区間の区間長がa以下のものがあるか、と考える。

    fn solve2(&self) -> Answer {
        // ソートによる解法
        let a = self.a;
        let b = self.b;
        let n = self.n;
        let ds = &self.ds;
        // 各予定の曜日(今日を0とする)のリスト
        let ds_mod = ds.iter().copied().map(|x| x % (a + b)).collect_vec();
        let ds_mod_plus_apb = ds_mod.iter().copied().map(|x| x + (a + b)).collect_vec();
        let ds_mod_loop = chain!(ds_mod, ds_mod_plus_apb).sorted().collect_vec();
        let ans = (0..n)
            // iから始まるn個の予定の曜日を含む曜日区間の長さの最小値
            .map(|i| ds_mod_loop[n + i - 1] - ds_mod_loop[i] + 1) // i..i+n での区間の最大-最小 + 1
            .any(|x| x <= a);
        Answer { ans }
    }

学び

抽象化

円環上の集合をある種の区間で覆うときの最小区間長を求める