ℹ️
proconioで入力を受け取るメモ
整数の入力
改行でもスペース区切りでも関係ないです。
入力
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]
}
クエリの入力
先頭の値によって引数の個数が変わるやつです。
いい方法が見つからないのでループで対処します。
下の例だと、query[i] == (1, x, y)
、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);
}
Discussion