LoginSignup
12
2

More than 1 year has passed since last update.

rustでatcoderのインタラクティブな問題やるときの注意

Last updated at Posted at 2022-03-22

概要

今回インタラクティブな問題がでてこれを解こうとしたがTLEに引っかかりまくって全くうまくいかなかった
flushしてるはずなのになんで!?とずっと思っていた
結論から言うと出力ではなく入力側で引っかかっていた、つまりproconioを何とかする必要があった。
ちなみに問題の中にflushしろと書いてあるが出力はいつも通りprintln!()でも問題ない。

追記
公式にも解説ったんだね
https://atcoder.jp/contests/abc244/editorial/3625

解決法

let mut stdin = LineSource::new(BufReader::new(io::stdin()));
macro_rules! input(($($tt:tt)*) => (proconio::input!(from &mut stdin, $($tt)*)));

上記2行を追加すればOKである。あとはいつも通りinput!マクロを使えばよい。
なお、上位陣の解答丸パクリしただけ。

とはいえ簡単に理解しなきゃいけないなーと思いマクロとproconioのドキュメントを少し読んでみた

proconioに関して

https://docs.rs/proconio/0.4.3/proconio/source/index.html
の中にある
「This is usually no problem in judging (except interactive problem?).」
思いっきり書いてあるー!はてなマークになってるけど完全に確定だからー!

とはいえなんで問題になってるかはよくわからん。
OnceSourceでは EOFが必要と書いてあるがatcoder側ではEOFがないのかもしれない。そんなことある?
なにはともあれLineSourceにしてあげることが必要であるようだ。
ちなみに結論ではマクロを使っているが、下記のようにすればマクロなしでも動く。
後述するが今回のマクロは一々fromとか書かなくていいようにしただけである

fn main() {
  let mut source = LineSource::new(BufReader::new(io::stdin()));
  input!{
  from &mut source, //ここに追加、&mutを付ける
  n:usize,
}

追記
input!の実装について詳しく見ているところがあった・・・が結局よくわからず。うーん
https://blog.ymgyt.io/entry/proconio_input_macro

マクロに関して

この方の記事がわかりやすかった
https://qiita.com/k5n/items/758111b12740600cc58f#tt

$が変数名を表すのでttが変数、ttが型である。。。同じでややこしい
ttは難しく自分もあまり理解できていない。上のリンクを読んで感覚をつかんだだけ
input!($tt)が記述されると

proconio::input!(from &mut stdin, $($tt)*))

を実行するという意味合い。単純にfromを含めていつものinputを実行してねというだけ

###最後に
上位陣はどっからこういう知識を仕入れてくるのだろう

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2