Count Points Parallel To Y

2 secs 1024 MB
recuraki's icon recuraki

はじめに

Pythonのdict(defaultdict)やC++のunordered_mapの各アクセスの計算量の平均時間計算量はO(1)O(1)です。 しかし、これらの内部のデータ構造の内部を意識した意図的な入力に対してO(N)O(N)となることがあります。

TLEする例 C++のunordered_map

TLEする例 Pythonのdefaultdict

map(C++)や二分探索で数える(Python)で各計算量をO(logN)O(logN)とすることができます。

C++のmap

Pythonの二分探索

C++のunordered_mapの場合

翻訳: unordered_mapのハッシュ衝突攻撃とその対策 (neal: Blowing up unordered_map, and how to stop getting hacked on it) の通りです。AtCoder C++20, C++23 gcc12.2 や MojaCoder のC++では85229の倍数を与えることでハッシュが衝突し各アクセスがO(N)O(N)となりTLEします。

unordered_mapではなくmapを使うと各アクセスがO(logN)O(logN)で可能になります。

Pythonのdefaultdictの場合

Qiitaに書きました。

元ネタ

元の問題

hackされるコード

hackケース生成コード