模板:
//最长上升序列nlogn
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e4+7;
int d[maxn],a[maxn];
int main()
{
int i,j,k,p,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&p);
for(i=1;i<=p;++i)
scanf("%d",&a[i]);
d[1]=a[1];
int len=1;
for(i=2;i<=p;++i)
{
if(a[i]>d[len])//不下降为 <=,上升为 <
{
d[++len]=a[i];
}
else
{//不下降为 upper_bound,上升为lower_bound
int j=lower_bound(d+1,d+len,a[i])-d;
d[j]=a[i];
}
}
printf("%d\n",len);
}
return 0;
}
——————
一道简单例题:
http://www.ifrog.cc/acm/status?problem_id=1097&user_nickname=UESTCStarry&language_id=&status_id=
一连多LCS转LIS
// ifrog 1097
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=1e5+7;
vector<int>e[maxn];
int d[maxn];
int n;
int len;
void init()
{
int i,j,k;
for(i=1;i<=n;++i) e[i].clear();
memset(d,0,sizeof(d));
for(i=1;i<=n;++i)
{
for(j=0;j<6;++j)
{
scanf("%d",&k);
e[i].pb(k);
}
sort(e[i].begin(),e[i].end());
}
len=0;
}
void doit()
{
int i,j,k;
for(i=1;i<=n;++i)
{
for(j=5;j>=0;--j)
{
int v=e[i][j];
if(v>d[len])
{
d[++len]=v;
}
else
{
int pos=lower_bound(d,d+len,v)-d;
d[pos]=v;
}
}
}
printf("%d\n",len);
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
init();
doit();
}
}