第一问让我们求一个最长不上升子序列。
此题第二问要用到Dilworth定理:偏序集的最少反链划分数等于最长链的长度
就是让我们求一个最长上升子序列。
nlogn解法:
#include<bits/stdc++.h>
using namespace std;
int arr[100010],ans1[100010],ans2[100010];
int len1=1,len2=1,id=1;
int main()
{
int x;
while(scanf("%d",&x)!=EOF)
arr[id++]=x;
id--;
ans1[1]=arr[1];
ans2[1]=arr[1];
for(int i=2; i<=id; i++)
{
if(ans1[len1]>=arr[i])
ans1[++len1]=arr[i];
else
{
int pos=upper_bound(ans1+1,ans1+1+len1,arr[i],greater<int>())-ans1;
ans1[pos]=arr[i];
}
if(arr[i]>ans2[len2])
ans2[++len2]=arr[i];
else
{
int pos=lower_bound(ans2+1,ans2+1+len2,arr[i])-ans2;
ans2[pos]=arr[i];
}
}
cout<<len1<<endl<<len2;
return 0;
}