比赛 防止浮躁的小练习v0.7 评测结果 AAAAAAAAAA
题目名称 拦截导弹 最终得分 100
用户昵称 Hzoi_Go灬Fire 运行时间 0.013 s
代码语言 C++ 内存使用 0.33 MiB
提交时间 2016-10-27 18:05:22
显示代码纯文本
  1. /*
  2. Name: 二分版拦截导弹 cogs
  3. Copyright: LOSER?
  4. Author: Go灬Fire
  5. Date: 13/10/16 19:08
  6. Description: 二分好恶心,二分好厉害
  7. */
  8. #include<cmath>
  9. #include<algorithm>
  10. #include<cstring>
  11. #include<cstdio>
  12. #include<cstdlib>
  13. #include<iostream>
  14. #define Begin freopen("missile.in","r",stdin);freopen("missile.out","w",stdout);
  15. #define End fclose(stdin);fclose(stdout);
  16. using namespace std;
  17. const int maxn=1500;
  18. int n,a[maxn],f[maxn],len[maxn];
  19. void Init();
  20. int Find(int x){
  21. int l=0,r=n;
  22. while(l<=r){
  23. int mid=(l+r)>>1;
  24. if(x>len[mid])r=mid-1;
  25. else l=mid+1;
  26. }
  27. return r;
  28. }
  29. int RFind(int x){
  30. int l=0,r=n;
  31. while(l<=r){
  32. int mid=(l+r)>>1;
  33. if(x<=len[mid])r=mid-1;
  34. else l=mid+1;
  35. }
  36. return r;
  37. }
  38. int main(){
  39. Begin;
  40. Init();
  41. //system("pause");
  42. End;
  43. return 0;
  44. }
  45. void Init(){
  46. int ans1=0,ans2=0;len[0]=0x7f7f7f7f;
  47. while(scanf("%d",&a[++n])!=EOF){
  48. f[n]=Find(a[n])+1;
  49. ans1=max(ans1,f[n]);
  50. if(len[f[n]]<a[n])len[f[n]]=a[n];
  51. }
  52. memset(f,0,sizeof(f));memset(len,0x7f,sizeof(len));len[0]=0;
  53. for(int i=1;i<=n;i++){
  54. f[i]=RFind(a[i])+1;
  55. ans2=max(f[i],ans2);
  56. len[f[i]]=a[i];
  57. }
  58. printf("%d\n%d\n",ans1,ans2);
  59. }