导弹拦截
最长单调上升子序列
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int f[1000000]; int z[1000000]; int lowbit(int x) { return x&-x; } int big; inline int ask(int x) { int r=0; for(int i=x;i>0;i-=lowbit(i)) r=max(r,f[i]); return r; } inline void add(int x,int v) { for(int i=x;i<=big;i+=lowbit(i)) f[i]=max(f[i],v); } inline int que(int x) { int r=0; for(int i=x;i<=big;i+=lowbit(i)) r=max(r,f[i]); return r; } inline void psh(int x,int v) { for(int i=x;i>0;i-=lowbit(i)) f[i]=max(f[i],v); } int tot; int a[1000000]; int ans; int main() { tot=1; while(scanf("%d",&a[tot])!=EOF) { big=max(big,a[tot]); z[tot]=a[tot]; tot++; } tot--; for(int i=1;i<=tot;i++) { int x=ask(a[i])+1; ans=max(ans,x); add(a[i]+1,x); } memset(f,0,sizeof(f)); int num=0; for(int i=1;i<=tot;i++) { int x=que(a[i])+1; num=max(num,x); psh(a[i],x); } printf("%d\n%d",num,ans); return 0; }