一道落下的题……
*
Dilworth定理(然而我也不会)
第一空求最长不上升子序列(用二分查找或lower_bound)
根据上一空那个定理
求最长不下降子序列(二分或upper_bound)
具体细节看代码吧
给出朴素代码*
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100005],d[100005],n;
int list1()
{
int l,r=n,mid,cnt=0,ans;
d[++cnt]=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]<=d[cnt]) d[++cnt]=a[i];
else
{
l=1;
r=cnt;
while(l<=r)
{
mid=(l+r)/2;
if(d[mid]<a[i])
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
d[ans]=a[i];
}
}
return cnt;
}
int list2()
{
memset(d,0,sizeof(d));
int l,r=n,mid,cnt=0,ans;
d[++cnt]=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]>d[cnt]) d[++cnt]=a[i];
else
{
l=1;
r=cnt;
while(l<=r)
{
mid=(l+r)/2;
if(d[mid]>=a[i])
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
d[ans]=a[i];
}
}
return cnt;
}
int main()
{
int ans;
while(scanf("%d",&a[++n])==1);
n-=1;
printf("%d\n%d",list1(),list2());
}