This documentation is automatically generated by online-judge-tools/verification-helper
This project is maintained by tsutaj
// 2次元LIS (最長増加部分列) // Verified: ABC038 D問題 // http://abc038.contest.atcoder.jp/tasks/abc038_d int n; pair<int, int> ab[100000]; int dp[100010]; int main(){ cin >> n; rep(i,0,n) cin >> ab[i].fr >> ab[i].sc; // h を昇順、w を降順にソート rep(i,0,n) ab[i].sc *= -1; sort(ab, ab + n); rep(i,0,n) ab[i].sc *= -1; // w の要素について普通に LIS をやる // w が等しいものを単調増加列に入れないようにするために、降順ソートをしている rep(i,0,100010) dp[i] = 10000000; rep(i,0,n){ *lower_bound(dp, dp + n, ab[i].sc) = ab[i].sc; } cout << lower_bound(dp, dp + n, 10000000) - dp << endl; } // ※lower_boundは指定された要素「以上」の値が現れる最初の位置の検索 // ※upper_boundは指定された要素「よりも大きい」値の値が現れる最初の位置の検索
#line 1 "dp/dp_000_lis_dim2.cpp" // 2次元LIS (最長増加部分列) // Verified: ABC038 D問題 // http://abc038.contest.atcoder.jp/tasks/abc038_d int n; pair<int, int> ab[100000]; int dp[100010]; int main(){ cin >> n; rep(i,0,n) cin >> ab[i].fr >> ab[i].sc; // h を昇順、w を降順にソート rep(i,0,n) ab[i].sc *= -1; sort(ab, ab + n); rep(i,0,n) ab[i].sc *= -1; // w の要素について普通に LIS をやる // w が等しいものを単調増加列に入れないようにするために、降順ソートをしている rep(i,0,100010) dp[i] = 10000000; rep(i,0,n){ *lower_bound(dp, dp + n, ab[i].sc) = ab[i].sc; } cout << lower_bound(dp, dp + n, 10000000) - dp << endl; } // ※lower_boundは指定された要素「以上」の値が現れる最初の位置の検索 // ※upper_boundは指定された要素「よりも大きい」値の値が現れる最初の位置の検索