1 条题解
-
1lzxzy 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%
- 上传者