题目链接:hdu_5748_Bellovin
题意:
给你一个数列ai,设f(a1,a2,a3,..an)=(f1,f2,f3,...,fn),其中fi表示以ai结尾的最长递增子序列长度,注意:必须要包括ai,当时就是被这里坑了,这TM也太坑爹了
题解:
直接上nlogn的LIS算法,记录一下位置就行了
#include<map>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
#include<functional>
#define pb push_back
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define mst(a,b) memset(a,b,sizeof(a))
#define F(i,a,b) for(int i=a;i<=b;++i)
#define ___ freopen("c:\\acm\\input.txt","r",stdin);
using namespace std;
typedef long long LL; int n,a[],ans[]; int main(){
int t;
scanf("%d",&t);
while(t--)
{
int len=,tp;
scanf("%d%d",&n,&tp);
a[]=tp,ans[]=;
F(i,,n)
{
scanf("%d",&tp);
if(a[len]<tp)a[++len]=tp,ans[i]=len;
else {
int pos=lower_bound(a+,a++len,tp)-a;
a[pos]=tp,ans[i]=pos;
}
}
F(i,,n)printf("%d%c",ans[i],i==n?'\n':' ');
}
return ;
}