競プロをやっていると、よく ソートされた値にインデックスを持たせたい とか、 RMQの値にインデックスを持たせたい とか、 グラフの辺にインデックスを持たせたい とか、 クエリにインデックスを持たせたい とかいうことがよくあります。
こんなときに使える汎用的なテクニックとは…?
ことです。
例を見てみましょう。
要素の数列 があります。
となるような の順列 を求めてください。
pairを作る必要がない 複数のものをまとめてソートするときかなり有利
C++17 を使うとこうなる
C++17 を使わない場合、
とする
要素の数列 があります。
以下のクエリに答えてください。
以下 https://ei1333.github.io/luzhiled/snippets/structure/segment-tree.html のセグメント木を使います。
ここでは有向グラフとします。
グラフに関しては struct Edge
が強力なのであまり出番がなさそう
辺がたくさん属性を持っていて、それらを別々の配列で管理したいときに便利
メモリ効率が良い
pair を使わない
無向グラフの場合は有向グラフになおすとできる 状況によっては少し面倒になるかも
テンプレート追加
— tatyam (@tatyam_prime) 2020年5月3日
vector<ll> iota(ll n){ vector<ll> ans(n); iota(ans.begin(), ans.end(), 0); return ans; }