概要
今回インタラクティブな問題がでてこれを解こうとしたが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を実行してねというだけ
###最後に
上位陣はどっからこういう知識を仕入れてくるのだろう