deduplicate の罠
ちょっとハマったのでメモ
TL; DR
deduplicate(a: seq[T]) をそのまま使うと、低速だよ($ O(N^2))
使うときは先にソートしてisSorted = true にしてね → a.sorted.deduplicate(isSoted = True)
deduplicated
これです。配列を渡すと重複する要素を削除した配列を返してくれます。reference に "Setting the optional argument isSorted to true (default: false) uses a faster algorithm for deduplication." という不穏な言葉が見えますね……
isSorted を入れた場合と入れない場合の比較
isSorted あり(310ms)
code:nim
let c = a.sorted.deduplicate(isSorted = true)
isSorted なし(3312ms, TLE)
code:nim
let c = a.sorted.deduplicate
38行目が違います。
よっぽどのことがない限り、sort して使いましょう。sort できない場合は hashset などを使って自力で実装しましょう(かなしい)
おまけ
別にこれでいいという話もあります、deduplicated くんのアイデンティティが危うい
https://atcoder.jp/contests/adt_all_20231018_2/submissions/46713466