比赛 防止浮躁的小练习v0.7 评测结果 AAAAAAAAAA
题目名称 拦截导弹 最终得分 100
用户昵称 Hzoi_Go灬Fire 运行时间 0.013 s
代码语言 C++ 内存使用 0.33 MiB
提交时间 2016-10-27 18:05:22
显示代码纯文本
/*
	Name: 二分版拦截导弹 cogs 
	Copyright: LOSER? 
	Author: Go灬Fire 
	Date: 13/10/16 19:08
	Description: 二分好恶心,二分好厉害 
*/
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#define Begin freopen("missile.in","r",stdin);freopen("missile.out","w",stdout);
#define End fclose(stdin);fclose(stdout);
using namespace std;
const int maxn=1500;
int n,a[maxn],f[maxn],len[maxn]; 
void Init();
int Find(int x){
	int l=0,r=n;
	while(l<=r){
		int mid=(l+r)>>1;
		if(x>len[mid])r=mid-1;
		else l=mid+1;
	}
	return r;
}
int RFind(int x){
	int l=0,r=n;
	while(l<=r){
		int mid=(l+r)>>1;
		if(x<=len[mid])r=mid-1;
		else l=mid+1;
	}
	return r;
}
int main(){
    Begin;
    Init();
    //system("pause");
    End;
    return 0;
}
void Init(){
	int ans1=0,ans2=0;len[0]=0x7f7f7f7f;
	while(scanf("%d",&a[++n])!=EOF){
		f[n]=Find(a[n])+1;
		ans1=max(ans1,f[n]);
		if(len[f[n]]<a[n])len[f[n]]=a[n];
	}
	memset(f,0,sizeof(f));memset(len,0x7f,sizeof(len));len[0]=0;
	for(int i=1;i<=n;i++){
		f[i]=RFind(a[i])+1;
		ans2=max(f[i],ans2);
		len[f[i]]=a[i];
	}
	printf("%d\n%d\n",ans1,ans2);
}