hdu5748 Bellovin(LIS模板)
阿新 • • 發佈:2018-12-24
其實就是求以ai(0<=i<n)結尾的最長上升子序列的個數。
最小的字典序就是f1,f2,f3......
這題O(n^2)做法會超時,需要nlongn,套一下模板就好了~
#include<bits/stdc++.h> using namespace std; const int inf = 1000000007; const int N = 100005; int a[N], g[N], d[N]; //模板詳見小白書P62 int main(){ int t,i,n; scanf("%d",&t); while(t--){ memset(d,0,sizeof(d)); scanf("%d",&n); for( i=0; i < n; ++i )scanf("%d", &a[i]); for(int i=1; i<=n; i++)g[i]=inf; for(int i=0; i<n; i++){ int k=lower_bound(g+1, g+n+1, a[i])-g;//在g[1]到g[n]中找 d[i]=k; g[k]=a[i]; } for(i=0;i<n;i++)printf("%d%c",d[i],i!=n-1?' ':'\n'); } return 0; }