https://atcoder.jp/contests/abc138/submissions/13182121
例えば、T[2]=rをSから検索する方法を考える。これを検索するにはT[1]=hの情報が大事になる。T[1]=S[4]=hだとすると
- S[4]以降のSにrがある→S[4]以降で最初に見つかったrを採用する
- S[4]以降のSにrがない→Sの終端まで行ったあと先頭に戻って最初に見つかったrを採用
の2つに場合分けされる。rがS[4]以降に存在するかどうか(h-index=4以降にrが存在するかどうか)を高速に調べるには二分探索をする。前処理でSの要素のうちaである全てのindexをメモしておき、同様にzまでindexをメモしておく。前処理によりSの要素全てのindexをメモした配列a-memoからz-memoが出来上がるが、このメモ配列に対してupper_bound(all(r-memo), h-index)、つまりメモの二分探索、をすれば実現できる。あとは ans[i] = ans[i-1] + 緑矢印の長さ を計算していくと最小値が求まる。