记录编号 485402 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012]射箭 最终得分 100
用户昵称 GravatarLadyLex 是否通过 通过
代码语言 C++ 运行时间 0.753 s
提交时间 2018-01-31 13:39:49 内存使用 27.02 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. using namespace std;
  6. #define N 100010
  7. #define db double
  8. db x[N],yy[N],y2[N];
  9. struct Vector
  10. {
  11. db x,y;
  12. Vector(db a=0,db b=0){x=a,y=b;}
  13. inline Vector operator + (const Vector &b)const {return Vector(x+b.x,y+b.y);}
  14. inline Vector operator - (const Vector &b)const {return Vector(x-b.x,y-b.y);}
  15. inline db operator * (const Vector &b)const {return x*b.y-b.x*y;}
  16. inline Vector operator * (const db &b)const {return Vector(x*b,y*b);}
  17. }p[N];
  18. struct line
  19. {
  20. Vector s,t,v;db k;int id;
  21. }l[N<<1],q[N<<1];int hd,tl;
  22. inline bool mt (const line &a,const line &b)
  23. {
  24. if(a.k!=b.k)return a.k<b.k;
  25. return (b.t-a.s)*a.v>0;
  26. }
  27. inline bool overwatch(Vector a,line b){return (b.s-a)*(b.t-a)<0;}
  28. inline Vector cross(line a,line b)
  29. {
  30. db l1=(a.t-b.s)*b.v,l2=b.v*(a.s-b.s);
  31. return a.s+a.v*(l2/(l1+l2));
  32. }
  33. int len;
  34. inline void solve(int le,int r)
  35. {
  36. if(le==r){printf("%d\n",le);return;}
  37. register int mi=(le+r)>>1,i,last=1;
  38. hd=1,tl=0;
  39. for(i=1;i<=len;++i)
  40. if(l[i].id<=mi+1)
  41. {
  42. while(hd<tl&&overwatch(cross(q[tl],q[tl-1]),l[i]))--tl;
  43. while(hd<tl&&overwatch(cross(q[hd],q[hd+1]),l[i]))++hd;
  44. q[++tl]=l[i];
  45. }
  46. while(hd<tl&&overwatch(cross(q[tl],q[tl-1]),q[hd]))--tl;
  47. tl-hd>1?solve(mi+1,r):solve(le,mi);
  48. }
  49. char B[1<<15],*S=B,*T=B;
  50. #define getc ((S==T)&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++)
  51. inline int read()
  52. {
  53. int x=0;register char c=getc;
  54. while(c<'0'|c>'9')c=getc;
  55. while(c>='0'&c<='9')x=10*x+(c^48),c=getc;
  56. return x;
  57. }
  58. int main()
  59. {
  60. // freopen("Ark.in","r",stdin);
  61. freopen("bzoj_2732.in","r",stdin);
  62. freopen("bzoj_2732.out","w",stdout);
  63. register int i,j,cnt,n;
  64. n=read();
  65. for(i=1;i<=n;++i)
  66. x[i]=read(),yy[i]=read(),y2[i]=read();
  67. for(i=1;i<=n;++i)
  68. {
  69. l[i].s=Vector(0,yy[i]/x[i]);
  70. l[i].v=Vector(1,-x[i]);
  71. l[i].t=l[i].s+l[i].v;
  72. l[i].k=atan2(l[i].v.y,l[i].v.x);
  73. l[i].id=i;
  74. l[i+n].s=Vector(0,y2[i]/x[i]);
  75. l[i+n].v=Vector(-1,x[i]);
  76. l[i+n].t=l[i+n].s+l[i+n].v;
  77. l[i+n].k=atan2(l[i+n].v.y,l[i+n].v.x);
  78. l[i+n].id=i;
  79. }
  80. len=n<<1;
  81. l[++len].s=Vector(0,0),l[len].v=Vector(0,1),l[len].t=Vector(0,1),l[len].k=atan2(1,0);l[len].id=0;
  82. l[++len].s=Vector(0,0),l[len].v=Vector(1,0),l[len].t=Vector(1,0),l[len].k=atan2(0,1);l[len].id=0;
  83. sort(l+1,l+len+1,mt);
  84. for(cnt=1,i=2;i<=len;++i)
  85. if(l[i].k!=l[cnt].k)l[++cnt]=l[i];
  86. len=cnt;
  87. solve(1,n);
  88. }