基因光线

xiaoxiao2021-02-28  120

基因光线

黑大帅统治古古怪界后,一直在玩一种很奇葩的游戏。在一个二维平面上,他先复制了n个小A,把他们放在不同的位置,然后射出一条ax+by+c=0的基因光线,宽度为d,即离这条直线的距离不大于d的小A会被射中。当然,某些悲剧的小A就会被射中,并变成黑小A。当然,这不是重点。玩了很久后,黑大帅猛然发现,自己竟然一次都没有射中小A。黑大帅怒了,于是他开启了作弊模式,将c改成自己想要的任意数值。现在,黑大帅想知道,在开启了作弊模式后,他射出一道基因光线最多能击中几个小A。

输入格式:

  第一行五个数字a,b,d,n,接下来n行每行两个数字x,y表示这个小A的坐标。

输出格式:

  一行一个数字表示最多能击中几个小A。

样例输入:

1 -1 0.707106782 5 0 0 1 0 0 1 2 0 2 1

样例输出:

4

数据范围:

50%的数据满足a=0; 100%的数据满足n<=100000,其余所有数值均为绝对值不大于1000的实数。

时间限制:

1s

空间限制:

64M

提示:

remove!!! 容易计算得在y轴上相差的距离为d*c,c见程序。我们先手动忽略常数,然后计算出该光线刚好击中一点时的 y值,然后扩展d的时候把每条光线都向上移d,就转化为对于每个2*d的区间求最多并集个数。即可 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using  namespace  std; #define PER(i,a,b) for(int i=a;i<=b;i++) #define REP(i,a,b) for(int i=a;i>=b;i--) double  a,b,d; int  n; struct  NODE{      double  x,y; }l[1100001]; const  double  inf=0.000000003; double  ll[1100001]; double  rr[1100001]; double  c; void  prepare( int  x) {      ll[x]=l[x].x*a+l[x].y*b; }   int  pointl,pointr; int  ans=0; int  ond=0; int  main() {      cin>>a>>b>>d>>n;      PER(i,1,n)  scanf ( "%lf%lf" ,&l[i].x,&l[i].y);      c= sqrt (a*a+b*b);      d=d*c;      PER(i,1,n) prepare(i);      sort(ll+1,ll+n+1); int  s=0; int  e=1; while  (e<n) {      s++;      while  (ll[e+1]-ll[s]<=d*2&&e<n) e++;      ans=max(ans,e-s+1); }      cout<<ans<< "\n" ; }
转载请注明原文地址: https://www.6miu.com/read-63710.html

最新回复(0)