前情提要:https://www.luogu.com.cn/discuss/show?postid=553164
我以下面这段代码测试,注意被注释的那一行:
#include <cstdio>
using namespace std;
const int max_n = 100000;
int dp[max_n+1] = {-2147483648}, arr[max_n], ans = 1;
int ser(int low)
{
int l = 0, r = ans + 1, mid, ret;
while (l < r)
{
mid = (l + r) >> 1;
if (dp[mid] < low)
ret = mid, l = mid + 1;
else
r = mid;
}
return ret + 1;
}
int main()
{
int n, pos;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", arr + i);
dp[1] = arr[0];
for (int i = 1; i < n; i++)
{
// if (arr[i] >= dp[ans])
if (arr[i] > dp[ans])
{
dp[++ans] = arr[i];
continue;
}
pos = ser(arr[i]);
dp[pos] = arr[i];
if (pos > ans)
ans++;
}
printf("%d\n", ans);
return 0;
}
显然,被注释的部分是错误的,可以被下面这组数据卡掉:
6
1 1 1 1 1 1
正确的输出是 1,上面那份错误的代码显然会输出 6。
然后改成被注释的部分能过,实在是离了个大谱。
已经有人反馈过这个问题了:https://www.luogu.com.cn/discuss/show?postid=518643