值得注意的是,在本地(VS)测试最后一个点(#subtask1)的数据,使用以下两种方法,答案都是正确的。
最后一个点的数据是,50000 49999 ...3 2 1 1 2 3 ... 49999 50000
#include <iostream>
int a[100050] = { 50050 }, dp[100050];
int b[100050], ans2;
int tail[100050] = { 50050 };
int BinSrc1(int n, int l, int r)
{
if (r <= 1)
return 1;
int m = (l + r) / 2;
// tail[] descends
if (n <= tail[m - 1] && n > tail[m])
return m;
if (n > tail[m - 1])
return BinSrc1(n, l, m);
if (n <= tail[m])
return BinSrc1(n, m + 1, r);
/*
for (int i = l; i <= r; i++)
{
if (n <= tail[i - 1] && n > tail[i]) return i;
}
std::cout << "ERROR";
return -1;
*/
}
int BinSrch(int n, int l, int r)
{
if (r == 0)
return 0;
int m = (l + r) / 2;
if (n == b[m])
return m;
if (n > b[m] && n <= b[m + 1])
return m + 1;
if (n < b[m])
return BinSrch(n, l, m);
if (n > b[m + 1])
return BinSrch(n, m, r);
}
int main()
{
int cnt = 0, ans1 = 0;
bool f = false;
do {
cnt++;
std::cin >> a[cnt];
if (a[cnt] <= tail[ans1])
{
tail[ans1 + 1] = a[cnt];
ans1++;
}
else
{
int k = BinSrc1(a[cnt], 1, ans1);
tail[k] = a[cnt];
}
/*
for (int i = 0; i < cnt; i++)
{
if (a[i] >= a[cnt])
if (dp[cnt] <= dp[i] + 1)
{
dp[cnt] = dp[i] + 1;
}
}
if (dp[cnt] == 0) dp[cnt] = 1;
if (dp[cnt] > ans1) ans1 = dp[cnt];
*/
} while (getchar() == ' ');
std::cout << ans1 << std::endl;
for (int i = 0; i <= cnt; i++)
{
bool flag = false;
if (a[i] > b[ans2])
{
ans2++;
b[ans2] = a[i];
}
else
{
// b[] ascends
int j = BinSrch(a[i], 0, ans2);
bool isEQ = a[i] == b[j];
b[j] = a[i];
if (!isEQ)
for (int k = j; k > 0; k--)
{
// Keep b[] ascending
if (b[k] >= b[k - 1]) break;
std::swap(b[k], b[k - 1]);
}
}
}
std::cout << ans2;
return 0;
}
while(std::cin >> a[++cnt])
{
if (a[cnt] <= tail[ans1])
{
tail[ans1 + 1] = a[cnt];
ans1++;
}
else
{
int k = BinSrc1(a[cnt], 1, ans1);
tail[k] = a[cnt];
}
}
有没有大佬知道是什么原因导致的该问题orz