ABC307 F - Virus 2 でハマったのでメモ。
ツイートは こちら。(教えてくださった方に感謝。)
a < b
という関係が成り立つときに a
から先に要素を取り出したいとします。
- ダメなやつ
auto comp = [](const T& a, const T& b) -> bool { return a < b; }; std::priority_queue<T, std::vector<T>, decltype(comp)> que(comp);
※デフォルトで std::less
が渡されているのに大きい順に pop されることに想いを馳せてみましょう。
- 動くやつ
auto comp = [](const T& b, const T& a) -> bool { return a < b; }; std::priority_queue<T, std::vector<T>, decltype(comp)> que(comp);
取り出したくないやつを引数の左側に持ってくると良いです。
だいたい T = std::tuple<int, int, int>
みたいなやつが出てきたときにラムダ式を書きたくなるので、
他には std::greater<T>
を渡して適宜符号を反転させる方法もあります。
std::sort
と同じ感覚でやると大変なことになる(なりました)ので、気を付けましょう。