$\newcommand{\O}{\mathrm{O}}$
ここで $2$ 次元単調減少列とは $\{ (x_1, y_1), (x_2, y_2), ... , (x_n, y_n) \}$ ($x_i < x_{i+1}$ かつ $y_i > y_{i+1}$)
というような $2$ 次元座標平面上の点の列を意味する.
本実装では $2$ 次元単調減少列 $S$ で $(x_k, y_k) \not \in S$ となるような点については矩形領域 $(-\inf, x_k) \times (-\inf, y_k)$ 内に $S$ 内の要素を少なくとも $1$ つ含むようなもの(下側階段)
を保持している.
(関数)
$insert(val)$ : 点 $val (\in \mathbb{R}^2)$ を追加する. 実際に下側階段に組み込まれたか(true / false)を返す.
時間計算量: insert ならし $\O (\log n)$
template<typename T> class LIS2D { private: using ptt = pair<T,T>; set<ptt> st; public: //実際に追加されたかどうかを返す bool insert(pair<T,T> val){ bool in = false; auto it = st.lower_bound(val); if(it != st.end()){ if(*it == val) return in; in = (it->second >= val.second); } if(in){ while(it != st.end() && it->second >= val.second){ it = st.erase(it); } }else{ if(it != st.begin()){ it--; in = (it->second > val.second); }else{ in = true; } } if(in) st.insert(val); return in; } void print(){ for(auto& val : st){ cout << "{" << val.first << "," << val.second << "}" << " "; } cout << "\n"; } };
AOJ : Railway Connection 提出コード(非想定解)