标签:hihocoder1508 ang2 1981 ++ point tot ang1 扫描线 pdd
题意:给定N个点,然后给定一个半径为R的圆,问这个圆最多覆盖多少个点。
思路:在圆弧上求扫描线。
hihocoder1508的代码。
#include<bits/stdc++.h> #define pdd pair<double,int> #define f first #define s second #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=200010; const double eps=1e-12; const double pi=acos(-1.0); struct point{ double x,y;}p[maxn]; double det(point a,point b){ return a.x*b.y-a.y*b.x;} double dot(point a,point b){ return a.x*b.x+a.y*b.y;} point operator +(point a,point b){ return point{a.x+b.x,a.y+b.y}; } point operator -(point a,point b){ return point{a.x-b.x,a.y-b.y}; } double dist(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));} int dcmp(double x){ if(fabs(x)<eps) return 0; return x>0?1:-1;} pdd a[maxn]; int ans,N; double ang1,ang2,R; void CirinterCir(point a,point b) { double L=dist(a,b)/2,t=acos(L/R); double base=atan2(b.y-a.y,b.x-a.x); ang1=base+t,ang2=base-t; } bool check(point i,point j) { double ang=(ang1+ang2)/2; point x=point{i.x+R*cos(ang),i.y+R*sin(ang)}; return dcmp(dist(x,j)-R)<=0; } void solve() { rep(i,1,N) { int cnt=1,Mx,tot=0; rep(j,1,N) { if(i==j||dist(p[i],p[j])>R+R) continue; if(p[i].x==p[j].x&&p[i].y==p[j].y) { cnt++; continue;} CirinterCir(p[i],p[j]); if(ang1>ang2) swap(ang1,ang2); if(check(p[i],p[j])){ a[++tot]=pdd(ang1-eps,-1); a[++tot]=pdd(ang2,0); } else { a[+tot]=pdd(-pi-eps,-1); a[++tot]=pdd(ang1,0); a[++tot]=pdd(ang2-eps,-1); a[++tot]=pdd(pi,0); } } sort(a+1,a+tot+1); Mx=cnt; rep(i,1,tot){ if(a[i].s==-1) cnt++; else cnt--; Mx=max(Mx,cnt); } ans=max(ans,Mx); } } int main() { scanf("%d%lf",&N,&R); rep(i,1,N) scanf("%lf%lf",&p[i].x,&p[i].y); solve(); printf("%d\n",ans); return 0; }
标签:hihocoder1508,ang2,1981,++,point,tot,ang1,扫描线,pdd 来源: https://www.cnblogs.com/hua-dong/p/11479910.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。