ℹ️

proconioで入力を受け取るメモ

2024/05/17に公開

整数の入力

改行でもスペース区切りでも関係ないです。

入力
N
A B
input! {
    n: usize,
    a: isize,
    b: isize
}

文字列の入力

input!の型にBytesを指定すると、入力された文字列をVec<u8>に変換してくれます。
もちろんStringも指定できますし、Vec<char>にしてくれるCharsもありますが、基本u8内に収まりますし、後でs[i] - b'a'のような操作がしやすいのでVec<u8>推しです。

入力
S
input! {
    s: Bytes
}

配列の入力

普通の配列もタプルの配列も同じように受け取れます。

入力
N M
A_1 A_2 ... A_N
S_1 T_1
S_2 T_2
.
.
S_M T_M
input! {
    n: usize,
    m: usize,
    a: [usize; n],
    st: [(usize, usize); m]
}

2次元配列の入力

2次元の場合も1次元のものを入れ子にするだけです。

入力
N M
A_(1, 1) A_(1, 2) ... A_(1, M)
A_(2, 1) A_(2, 2) ... A_(2, M)
.
.
A_(N, 1) A_(N, 2) ... A_(N, M)
input! {
    n: usize,
    m: usize,
    a: [[usize; m]; n]
}

要素数がバラバラな配列の入力

配列の先頭にその配列の要素数が書いてあるやつです。

入力
N
M_1 A_(1, 1) A_(1, 2) ... A_(1, M_1)
M_2 A_(2, 1) A_(2, 2) ... A_(2, M_2)
.
.
M_N A_(N, 1) A_(N, 2) ... A_(N, M_N)
input! {
    n: usize,
    a: [[usize]; n]
}

クエリの入力

先頭の値によって引数の個数が変わるやつです。
いい方法が見つからないのでループで対処します。
下の例だと、t_i = 1のときはquery[i] == (1, x, y)t_i = 2のときはquery[i] == (2, x, 0)(3番目の要素は意味ない)になります。
Rust的にちゃんとやるならクエリの種類と引数をenumで定義しておいてinput!で受け取れるようにトレイト実装するべきなんでしょうが、競プロ中はもちろんできないのでこの手に限る。

入力
Q
1 x y
2 x
.
.
query_Q
input! {
    q: usize
}
let mut query = vec![];
for _ in 0..q {
    input! {
        t: usize
    }
    if t == 1 {
        input! {
            x: usize,
            y: usize
        }
        query.push((t, x, y));
    } else {
        input! {
            x: usize
        }
        query.push((t, x, 0));
    }
}

グラフの入力

Usize1を使うと1-indexedを0-indexedに直してくれるので、グラフにするときに便利です。
下の例では無向グラフを作っています。

入力
N M
A_1 B_1
A_2 B_2
.
.
A_M B_M
input! {
    n: usize,
    m: usize,
    ab: [(Usize1, Usize1); m]
}
let mut graph = vec![vec![]; n];
for (a, b) in ab {
    graph[a].push(b);
    graph[b].push(a);
}

私は何も考えずにinput!書きたいので後からグラフ作ってますが、下のほうにしたほうが賢いと思います。

input! {
    n: usize,
    m: usize
}
let mut graph = vec![vec![]; n];
for _ in 0..m {
    input! {
        a: Usize1,
        b: Usize1
    }
    graph[a].push(b);
    graph[b].push(a);
}
GitHubで編集を提案

Discussion