用的是nlogn的动态规划,样例点过了,为什么全wa呢......
代码如下
#include<bits/stdc++.h>
using namespace std;
int a[1000001];
int ans[1000010];
int ans2[1000010];
int n;
int find(int key);
int find2(int key);
int main()
{
int n;
cin >> n;
ans[0] = 1e9;
for (int i = 1;i <= n;i++)
{
cin >> a[i];
}
int k = 1;
for (int i = 1;i <= n;i++)
{
if (ans[k - 1] > a[i])
{
ans[k] = a[i];
k++;
}
else
{
ans[find(a[i])] = a[i];
}
}
int w1 = k + 1;
ans2[0] = -1;
k = 1;
for (int i = 1;i <= n;i++)
{
if (ans2[k - 1] < a[i])
{
ans2[k] = a[i];
k++;
}
else
{
ans2[find(a[i])] = a[i];
}
}
int w2 = k;
cout << w1 << endl << w2;
return 0;
}
int find(int key)
{
int l = 1,r = n;
int id = -1;
while (l < r)
{
if (ans[(l + r) / 2 - 1] > key && ans[(l + r) / 2] < key)
{
return (l + r) / 2;
}
if (ans[(l + r) / 2] == key)
{
id = (l + r) / 2;
break;
}
if (ans[(l + r) / 2] < key)
l = (l + r) / 2;
if (ans[(l + r) / 2] > key)
r = (l + r) / 2;
}
return id;
}
int find2(int key)
{
int l = 1,r = n;
int id = -1;
while (l < r)
{
if (ans2[(l + r) / 2 - 1] < key && ans[(l + r) / 2] > key)
{
return (l + r) / 2;
}
if (ans2[(l + r) / 2] == key)
{
id = (l + r) / 2;
break;
}
if (ans2[(l + r) / 2] < key)
l = (l + r) / 2;
if (ans2[(l + r) / 2] > key)
r = (l + r) / 2;
}
return id;
}
谢谢