基因光线
黑大帅统治古古怪界后,一直在玩一种很奇葩的游戏。在一个二维平面上,他先复制了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"
;
}