1 条题解
- 
  1
lzxzy LV 6 MOD @ 2019-05-04 10:49:41
很简单,用一个数组把a[k]左边比a[k]小的取出来,求LIS;
再把a[k]右边比a[k]大的取出来,再求一次LIS;建议使用二分查找。
当当前的数大于栈顶时,压入栈,否则,二分查找栈中比当前数大的最小数,替换。\(code:\)
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();} while (c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-48;c=getchar();} return x*f; } const int MAXN=300005; int n,k,cnt,ans; int a[MAXN],b[MAXN],f[MAXN]; int find(int l,int r,int k) { int mid; while (l<r) { mid=(l+r)>>1; if (f[mid]>=k)r=mid; else l=mid+1; } return l; } int calc(int n,int c[MAXN]) { memset(f,0,sizeof(f)); int len=0,k; for (int i=1;i<=n;i++) if (c[i]>f[len])f[++len]=c[i]; else f[k=find(1,len,c[i])]=min(f[k],c[i]); return len; } int main() { n=read();k=read(); for (int i=1;i<=n;i++) a[i]=read(); cnt=0; for (int i=1;i<k;i++) if (a[i]<a[k])b[++cnt]=a[i]; ans+=calc(cnt,b); cnt=0; for (int i=k+1;i<=n;i++) if (a[i]>a[k])b[++cnt]=a[i]; ans+=calc(cnt,b); printf("%d\n",ans+1); return 0; } 
- 1
 
信息
- ID
 - 1002
 - 难度
 - 8
 - 分类
 - (无)
 - 标签
 - (无)
 - 递交数
 - 11
 - 已通过
 - 2
 - 通过率
 - 18%
 - 上传者