https://www.luogu.org/problemnew/show/P1020
第一问就是最长不上升子序列,第二问题解说用离散数学里的Dilworth定理,看不懂证明,它的结论是:将序列划分若干个为不上升子序列,使得划分的个数最小,那么这个个数等于序列的最长上升子序列的大小。
#include<bits/stdc++.h>
using namespace std;
int n;
int d[100005];
int L=1,R=0;
int d2[100005];
int binary(int v)
{
int l=L,r=R,m;
while(l<r)
{
m=(l+r)/2;
if(d[m]>=v)l=m+1;
else r=m;
}
return r;
}
int main()
{
// freopen("input.in","r",stdin);
fill(d,d+100005,-(1<<30));
fill(d2,d2+100005,(1<<30));
while(cin>>n)
{
R++;
int pos=binary(n);
d[pos]=n;
*lower_bound(d2+1,d2+R+1,n)=n;
}
for(int i=R;i>=L;i--)if(d[i]!=-(1<<30))
{
cout<<i<<endl;
break;
}
for(int i=R;i>=L;i--)if(d2[i]!=(1<<30))
{
cout<<i<<endl;
break;
}
return 0;
}