AtCoder Beginner Contest 444 D

https://atcoder.jp/contests/abc444/tasks/abc444_d

和を求める問題はだいたい和の順序を入れ替えればよいです。この問題では、各桁にいくつ1があるかを調べて、繰り上がりを考慮して数字に直して、最後に出力します。

// Many Repunit Sum
#![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_input() -> Vec<usize> {
    let _N: usize = read();
    let A: Vec<usize> = read_vec();
    A
}

fn convert(c: Vec<usize>) -> Vec<usize> {
    let mut ds: Vec<usize> = vec![];
    let mut carry: usize = 0;
    for n in c {
        let d = (n + carry) % 10;
        carry = (n + carry) / 10;
        ds.push(d)
    }
    while carry > 0 {
        let d = carry % 10;
        carry /= 10;
        ds.push(d)
    }
    ds
}

fn print_digits(ds: Vec<usize>) {
    for d in ds.into_iter().rev() {
        print!("{}", d)
    }
    println!("")
}

fn F(mut A: Vec<usize>) {
    let mut N = A.len();
    A.sort();
    let mut c: Vec<usize> = vec![N; A[N-1]+1];
    for a in A {
        N -= 1;
        c[a] = N
    }
    for i in 1..c.len() {
        if c[i] > c[i-1] {
            c[i] = c[i-1]
        }
    }
    _ = c.pop();
    let ds = convert(c);
    print_digits(ds)
}

fn main() {
    let A = read_input();
    F(A)
}