标签:
A.贪心
B.b题我昨晚看两个队友都没写出来,早上看觉得挺简单的,天真以为是要以ai结尾的连续的,wa1...然后知道是可以不连续的,做着做着忘了是要以ai结尾的,以为是前面的子序列最长就可以了,wa4...
其实如果了解O(nlogn)的算法就可以很快想出来了,亏我还是写过模板的人,各种wa我也是醉了,每次只要在找到当前数字在LIS数组上的位置就可以了
题目还是挺好的,我发现题目写的太少很容易看错题意呀,怎么破
#include <iostream> #include <map> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 1e5+100; int a[MAXN],b[MAXN]; int c[MAXN]; int main() { int T; scanf("%d",&T); while(T--){ int n; int top=0; int mmax = -1; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); int l=0,r=top; while(l<r){ int m = l+(r-l)/2; if(b[m]>=a[i]){ r = m; }else{ l = m+1; } } if(l==top){top++;b[l] = a[i];} else if(a[i]<b[l]){ b[l] = a[i]; } //mmax = max(mmax,l+1); c[i] = l+1; } for(int i=0;i<n;i++){ if(i==0)printf("1"); else{ printf(" %d",c[i]); } } cout<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/EdsonLin/p/5700792.html