意味:
与えられたnnグループnのリーダーはaia_iですa私、幅はbi b_ib私ai <aj a_i <a_jの場合、赤い封筒a私<aJとbi <bj b_i <b_jb私<bJ、次に赤い封筒ii私は赤い封筒jjにインストールすることができますj。次に、一度に最大でいくつの赤い封筒を入れ子にすることができるかを尋ねます。
データ範囲:1≤n≤105、1≤ai、bi≤109 1 \ leq n \ leq 10 ^ 5,1 \ leq a_i、b_i \ leq 10 ^ 91≤n≤1 05、1≤a私、b私≤1 09
解決策:
最初の次元aaを昇順で検討します2番目の次元のaとbbbは再びドゥLISを。ここでの問題は、同じaaが存在する可能性があることです互いにネストされた赤い封筒。これは要件に沿っていないため、2番目の次元bbがあります。bは降順でソートされ、各ディメンションaaが確実になります。Aは多くても1つしか選択できません。
コード:
const int N = 100010;
struct Node {
int w, h;
bool operator < (const Node &A) const {
if(w == A.w) return h > A.h;
return w < A.w;
}
}a[N];
int t[N], tg;
int b_s(int l, int r, int x) {
while(l < r) {
int mid = l + r >> 1;
if(a[t[mid]].h >= x) r = mid;
else l = mid + 1;
}
return l;
}
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& env) {
int n = 0;
for(auto &u : env) a[++n] = {
u[0], u[1]};
if(n == 0) return 0;
sort(a + 1, a + n + 1);
tg = 0;
t[++tg] = 1;
for(int i = 2; i <= n; ++i) {
if(a[i].h > a[t[tg]].h) t[++tg] = i;
else if(a[i].h < a[t[tg]].h) t[b_s(1, tg, a[i].h)] = i;
}
return tg;
}
};