自用模板0.0
1.最长上升子序列:
vector<int> q;
for(int i=0;i<n;i++)
{
int x=q.size();
if(!x||a[i]>q[x-1])
{
q.push_back(a[i]);continue;
}
int l=0,r=x,mid;
while(l<r)
{
mid=(l+r)>>1;
if(q[mid]>=a[i])
r=mid;
else
l=mid+1;
}
q[r]=min(q[r],a[i]);
}
cout<<q.size()<<endl;
2.最长下降子序列(数组顺序倒过来就完事了)
vector<int> q;
for(int i=n-1;i>=0;i--)
{
int x=q.size();
if(!x||a[i]>q[x-1])
{
q.push_back(a[i]);continue;
}
int l=0,r=x,mid;
while(l<r)
{
mid=(l+r)>>1;
if(q[mid]>=a[i])
r=mid;
else
l=mid+1;
}
q[r]=min(q[r],a[i]);
}
cout<<q.size()<<endl;
3.最长非下降子序列
vector<int> q;
for(int i=0;i<n;i++)
{
int x=q.size();
if(!x||a[i]>=q[x-1])
{
q.push_back(a[i]);continue;
}
int l=0,r=x,mid;
while(l<r)
{
mid=(l+r)>>1;
if(q[mid]>a[i])
r=mid;
else
l=mid+1;
}
q[r]=min(q[r],a[i]);
}
4.最长非上升子序列
vector<int> q;
for(int i=n-1;i>=0;i--)
{
int x=q.size();
if(!x||a[i]>=q[x-1])
{
q.push_back(a[i]);continue;
}
int l=0,r=x,mid;
while(l<r)
{
mid=(l+r)>>1;
if(q[mid]>a[i])
r=mid;
else
l=mid+1;
}
q[r]=min(q[r],a[i]);
}