解説
クエリは以下のように言い換えられます.
- Ti=0 のとき,j>i かつ Tj=1 を満たすような j を j1,j2,…,jki とする.max(Xj1,Xj2,…,Xjki) を答えよ.
クエリを順番に処理する場合,i 番目のクエリでは最大で Q−i 個の j をチェックする必要があるため,全体の計算量は O(Q2) となり TLE してしまいます.
そこで,クエリを逆順に処理することを考えると,クエリは以下のように解釈することができます.
- 最初 Sakky さんはカードを 1 枚も持っていない.
- Ti=0 のとき,現在持っているカードに書かれた数のうち,値が最大のものを答える.
- Ti=1 のとき,Xi が書かれたカードを持ち札に加える.
この解釈のもとでは,「現在持っているカードに書かれた数のうち,値が最大のもの」を更新しながらクエリを処理することで,計算量は O(Q) に抑えられます.
別解を紹介します.
まず,クエリをすべて先読みすることによって,最初に Sakky さんが所持しているカードを求めます.
その後,Python の heapq
や C++ の multiset
を用いて手札の更新と最大値の取得を行いながらクエリを順番に処理します.
この方法では O(QlogQ) の計算量で問題を解くことができます.