记录编号 447172 评测结果 AAAAAAATTT
题目名称 [NOIP 2013]花匠 最终得分 70
用户昵称 Gravatar+1s 是否通过 未通过
代码语言 C++ 运行时间 3.023 s
提交时间 2017-09-09 15:41:40 内存使用 70.68 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. int n,a[100010],ar[100010],tp[100010],k,re[100010][5];
  6. struct tre{int l,r,ma;}stree[5000500],stree2[5000500];
  7. int mxx(int a,int b){return a>b?a:b;}
  8. void bui(int l,int r,int idx,struct tre *t)
  9. {
  10. (t+idx)->l=l;
  11. (t+idx)->r=r;
  12. (t+idx)->ma=0;
  13. if(l==r)return;
  14. int m=(l+r)/2;
  15. bui(l,m,idx*2,t);
  16. bui(m+1,r,idx*2+1,t);
  17. }
  18. int qry(int l,int r,int idx,struct tre t[])
  19. {
  20. if(l>r)return 0;
  21. if(t[idx].l==0&&t[idx].r==0)return 0;
  22. if(t[idx].l==l&&t[idx].r==r)return t[idx].ma;
  23. if(r<=t[idx*2].r)return qry(l,r,idx*2,t);
  24. else if(l>=t[idx*2+1].l)return qry(l,r,idx*2+1,t);
  25. else return mxx(qry(l,t[idx*2].r,idx*2,t),qry(t[idx*2+1].l,r,idx*2+1,t));
  26. }
  27. void upda(int nu,int val,int idx,struct tre *tr)
  28. {
  29. if((tr+idx)->l==0&&(tr+idx)->r==0)return;
  30. if((tr+idx)->l<=nu&&nu<=(tr+idx)->r)(tr+idx)->ma=mxx((tr+idx)->ma,val);
  31. upda(nu,val,idx*2,tr);
  32. upda(nu,val,idx*2+1,tr);
  33. }
  34. int bs(int nu)
  35. {
  36. int lo=1,hi=k;
  37. while(lo<hi)
  38. {
  39. int md=(lo+hi)>>1;
  40. if(tp[md]>=nu)hi=md;
  41. else lo=md+1;
  42. }
  43. return hi;
  44. }
  45. int ma()
  46. {
  47. freopen("FlowerNOIP2013.in","r",stdin);
  48. freopen("FlowerNOIP2013.out","w",stdout);
  49. scanf("%d",&n);
  50. for(int i=1;i<=n;i++)
  51. {
  52. scanf("%d",&a[i]);
  53. a[i]++;
  54. ar[i]=a[i];
  55. }
  56. sort(a+1,a+1+n);
  57. for(int i=1;i<=n;i++)if(a[i]!=a[i-1])tp[++k]=a[i];
  58. for(int i=1;i<=n;i++)ar[i]=bs(ar[i]);
  59. bui(1,n,1,stree);
  60. bui(1,n,1,stree2);
  61. re[1][0]=re[1][1]=1;
  62. upda(ar[1],1,1,stree);
  63. upda(ar[1],1,1,stree2);
  64. for(int i=2;i<=n;i++)
  65. {
  66. int m1=0,m2=0;
  67. m1=qry(ar[i]+1,n,1,stree2),m2=qry(1,ar[i]-1,1,stree);
  68. re[i][0]=m1+1;
  69. re[i][1]=m2+1;
  70. upda(ar[i],m1+1,1,stree);
  71. upda(ar[i],m2+1,1,stree2);
  72. }
  73. int mx=0;
  74. for(int i=1;i<=n;i++)mx=mxx(mx,max(re[i][0],re[i][1]));
  75. printf("%d",mx);
  76. return 0;
  77. }
  78. int faq=ma();
  79. int main()
  80. {
  81. return 0;
  82. }