以下の内容はhttps://inamori.hateblo.jp/entry/2025/07/27/112208より取得しました。


AtCoder Beginner Contest 416 D

https://atcoder.jp/contests/abc416/tasks/abc416_d

足してM以上になるペアをなるべくたくさん作ればよいです。Aを降順、Bを昇順にして、尺取り法的に処理すればよいです。

// Match, Mod, Minimize 2
#![allow(non_snake_case)]


//////////////////// library ////////////////////

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect()
}


//////////////////// process ////////////////////

fn read_test() -> (i64, Vec<i64>, Vec<i64>) {
    let v: Vec<i64> = read_vec();
    let M = v[1];
    let A: Vec<i64> = read_vec();
    let B: Vec<i64> = read_vec();
    (M, A, B)
}

fn F_each(M: i64, mut A: Vec<i64>, mut B: Vec<i64>) -> i64 {
    let N = A.len();
    A.sort_by(|a, b| b.cmp(&a));
    B.sort();
    let mut s = A.iter().sum::<i64>() + B.iter().sum::<i64>();
    let mut i: usize = 0;
    for a in A {
        while a + B[i] < M {
            i += 1;
            if i == N {
                return s
            }
        }
        s -= M;
        i += 1;
        if i == N {
            break
        }
    }
    s
}

fn F(T: usize) {
    for _ in 0..T {
        let (M, A, B) = read_test();
        println!("{}", F_each(M, A, B))
    }
}

fn main() {
    let T: usize = read();
    F(T)
}



以上の内容はhttps://inamori.hateblo.jp/entry/2025/07/27/112208より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14