记录编号 |
243616 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 1999]拦截导弹 |
最终得分 |
100 |
用户昵称 |
【离开·再见】星裔·自由蒂兰 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.000 s |
提交时间 |
2016-03-30 10:41:35 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=40010;
int Find(int,int,int);
int Refind(int,int,int);
int h[maxn],ge[maxn],len[maxn];
int rege[maxn],relen[maxn];
inline int haha()
{
freopen("missile.in","r",stdin);
freopen("missile.out","w",stdout);
memset(h,0,sizeof(h));
memset(ge,0,sizeof(ge));
memset(rege,0,sizeof(rege));
memset(len,0,sizeof(len));
len[0]=0x7f7f7f7f;
memset(relen,127,sizeof(relen));
relen[0]=0;
int p=1;
while(scanf("%d",&h[p])!=EOF)p++;
p--;
for(int i=1;i<=p;i++)
{
int z=Find(h[i],0,i-1);
ge[i]=z;
len[z]=h[i];
}
for(int i=1;i<=p;i++)
{
int z=Refind(h[i],0,i-1);
rege[i]=z;
relen[z]=h[i];
}
int ans=0,an=0;
for(int i=1;i<=p;i++)
{
if(ans<ge[i])ans=ge[i];
if(an<rege[i])an=rege[i];
}
printf("%d\n%d\n",ans,an);
return 0;
}
int hehe=haha();
int main(){;}
int Find(int x,int l,int r)
{
if(r<l)return l;
int mid=(l+r)>>1;
if(len[mid]>=x)Find(x,mid+1,r);
else Find(x,l,mid-1);
}
int Refind(int x,int l,int r)
{
if(r<l)return l;
int mid=(l+r)>>1;
if(relen[mid]>=x)Refind(x,l,mid-1);
else Refind(x,mid+1,r);
}