RT,问题出在二分求最长不下降子序列这一部分
for (int i = 1; i <= n + 1; ++i) {
int l = 0, r = len;
while (l <= r) {
int mid = l + r >> 1;
if (c[mid] <= b[i]) l = mid + 1;
else r = mid - 1;
}
if (l == len + 1) ++len;
f[i] = l;
c[l] = b[i];
lst[l].push_back(i);
}
这样写#11WA了
改成
for (int i = 1; i <= n + 1; ++i) {
int l = 0, r = len;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (c[mid] <= b[i]) l = mid;
else r = mid - 1;
}
if (l == len) ++len;
f[i] = l + 1;
c[l + 1] = b[i];
lst[f[i]].push_back(i);
}
就AC了
一直没搞懂两者的区别,有无大佬帮我解答疑惑