use proconio::derive_readable;
use std::collections::VecDeque;
#[derive_readable]
struct Query {
t: usize,
x: usize,
}
impl Query {
fn execute(&self, mut deck: VecDeque<usize>) -> VecDeque<usize> {
match self.t {
1 => deck.push_front(self.x),
2 => deck.push_back(self.x),
3 => {
println!("{}", deck[self.x - 1]);
}
_ => (),
}
deck
}
}
fn main() {
proconio::input! {
q: usize,
}
let mut deck = VecDeque::new();
for _ in 0..q {
proconio::input! {query: Query}
deck = query.execute(deck);
}
}
std::collections::VecDeque
を使用しました。Deque(double-ended queue)は日本語で「両端キュー」と呼び、その名の通り両端でのデータ挿入・削除が得意なデータ型となっています。今回の問題では、deck.push_front(self.x)
: カードを山札の一番上に入れるdeck.push_back(self.x)
: カードを山札の一番下に入れる
として、カードを山札(deck)に入れる動作を再現しています。proconio::input!
マクロで構造体に入力を読み込む際、構造体の前に#[proconio::derive_readable]
を付ける