题意:给出序列a[ ],求f[ ],f[i]指到i最小LIS。
题解:LIS变形,设定一个数组b[ ],每查找一次,把a[i]加入b[ j],j为找到的子序列长度。
<span style="font-size:18px;">#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int main(){
int t,n,i,a[100100],b;
int s[100100];
scanf ("%d",&t);
while (t--){
scanf ("%d",&n);
for (i=0;i<n;i++){
scanf ("%d",&a[i]);
s[i]=INF;//初始化
}
for (i=0;i<n;i++){
b=lower_bound(s,s+n,a[i])-s;//截止a[i]的LCS长度
printf ("%d",b+1);//求字典序,需要+1
if (i!=n-1)
printf (" ");
s[b]=a[i];//a[i]加入s数组,便于下一次查找
}
printf ("\n");
}
return 0;
} </span>