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

被折叠的 条评论
为什么被折叠?



