Ccmmutty logo
Commutty IT
2 min read

RustとAtCoderを勉強する(typical90_bi)

https://cdn.magicode.io/media/notebox/711fdc36-059e-4008-a4b1-d948c08d97dd.jpeg

はじめに

AtCoderの問題をRustで解いていきます。AtCoderもRustも初心者ですが、温かい目で成長を見守っていただけるとありがたいです。
今回は、競プロ典型90問061 - Deck(★2)を解きました。

提出コード

rust
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]を付ける

Discussion

コメントにはログインが必要です。