洛谷P1020 导弹拦截【二分,dp】

链接

https://www.luogu.org/problemnew/show/P1020

思路

100分的算法直接 O(n2) O ( n 2 ) ,跑一遍dp,跑一次贪心就行了
200分的算法在算法一的基础上加上二分

代码

#include
#include
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;int a[100001],n,f[100001],ans1,ans2;
int main()
{
    f[0]=50234568;
    while(scanf("%d",&a[++n])!=EOF);--n;//输入
    r(i,1,n)
     if(f[ans1]>=a[i])
      f[++ans1]=a[i];
     else
      {
        int l=1,r=ans1;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if(f[mid]>=a[i]) l=mid+1;else r=mid-1;
        }
        f[l]=a[i];//二分
      }
    fill(f,f+n,0);//重新初始化
    r(i,1,n)
     if(f[ans2]else
      {
        int l=1,r=ans2;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if(f[mid]>=a[i]) r=mid-1;else l=mid+1;
        }
        f[l]=a[i];//二分
      }
    printf("%d\n%d",ans1,ans2);//输出
}

你可能感兴趣的:(dp)