P1020 [NOIP1999 普及组] 导弹拦截

 

 

 

 

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
const int MAXN=1e5+3;
int n,t,H[MAXN],F[MAXN];
int main(){
    while(~scanf("%d",&H[++n])); --n;
    t=0,memset(F,0,sizeof(F)),F[0]=INF;
    up(1,n,i){
        int l=0,r=t+1; while(r-l>1){
            int m=l+(r-l)/2;
            if(F[m]>=H[i]) l=m; else r=m;
        }
        int x=l+1;  // dp[i]
        if(x>t) t=x; F[x]=H[i];
    }
    printf("%d\n",t);
    t=0,memset(F,0,sizeof(F)),F[0]=0;
    up(1,n,i){
        int l=0,r=t+1; while(r-l>1){
            int m=l+(r-l)/2;
            if(F[m]<H[i]) l=m; else r=m;
        }
        int x=l+1;
        if(x>t) t=x; F[x]=H[i];
    }
    printf("%d\n",t);
    return 0;
}

/*
89 126 85 103 101 86 86 98 96 99 89 81 101 92 79 77 82 97 83 100 78 72 79 97 71 80 98 89 69 74
*/
//12 6 [12,8]
/*
#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
using namespace std;

const int N = 1e5 + 5;
int a[N], x, l, dp[N], maxn;
int g[N], cnt,ans1,ans2;

int main() {
    
    while (cin>>x){
        
        a[++l] = x;
        if(cin.get()=='\n') break;
    } 
    
    //cin>>x; a[++l]=x;
    
    
//    memset(dp,1,sizeof(dp));//

//    for(int i=1;i<=l;i++) cout<<a[i]<<endl;
    for(int i=1;i<=l;i++) dp[i]=1;
    
    for(int i=2;i<=l;i++)
    {
        for(int j=1;j<=i-1;j++)
        {
            if(a[i]<=a[j]) dp[i]=max(dp[i],dp[j]+1);
        }
    }
    for(int i=1;i<=l;i++) ans1=max(ans1,dp[i]);
    cout<<ans1<<endl;
    
    for(int i=1;i<=l;i++) dp[i]=1;
    
    for(int i=2;i<=l;i++)
    {
        for(int j=i-1;j>=1;j--)
        {
            if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);
        }
    }
    for(int i=1;i<=l;i++) ans2=max(ans2,dp[i]);
    
    cout<<ans2<<'\n';
    
}
*/
View Code

 

 
posted @ 2023-08-11 12:00  JMXZ  阅读(13)  评论(0)    收藏  举报