二分细节求教
查看原帖
二分细节求教
464809
Lzc_123楼主2025/7/26 13:59

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了

一直没搞懂两者的区别,有无大佬帮我解答疑惑

2025/7/26 13:59
加载中...