BZOJ1338: Pku1981 Circle and Points单位圆覆盖
2016-04-24 09:29
711 查看
提供一个暴力的想法
极大肯定是两个点在圆周上
然后O(n3)O(n^3)暴力吧卡卡常数就过了
好吧。。。
其实有个O(n2lgn)O(n^2lgn) 的解法 主要思路就是对于每个点求包含这个点的最被包含点集
具体看爱神Blog
/article/2566024.html
极大肯定是两个点在圆周上
然后O(n3)O(n^3)暴力吧卡卡常数就过了
好吧。。。
其实有个O(n2lgn)O(n^2lgn) 的解法 主要思路就是对于每个点求包含这个点的最被包含点集
具体看爱神Blog
/article/2566024.html
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const double r=1; const double pi=acos(-1); const double eps=1e-7; struct Circle { double x,y; inline void get(){scanf("%lf%lf",&x,&y);} }P[100001]; #define abs(a) ((a)<0?(-(a)):(a)) struct Pair { double bg; int ed; inline friend bool operator <(Pair a,Pair b){return a.bg<b.bg||(abs(a.bg-b.bg)<eps&&a.ed<b.ed);} }Cache[100001]; inline double dis(Circle a,Circle b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));} int main() { while(true) { int n,tot,ans=0; scanf("%d\n",&n); if(n==0)return 0; for(int i=1;i<=n;i++)P[i].get(); for(int i=1;i<=n;i++) { tot=0; for(int j=1;j<=n;j++) if(i^j) { double D=dis(P[i],P[j]); if(D>2.0)continue; double T=atan2(P[j].y-P[i].y,P[j].x-P[i].x); T=T<0?T+2*pi:T; double Pt=acos(D/2.0); Cache[++tot]=(Pair){T-Pt+2*pi,false}; Cache[++tot]=(Pair){T+Pt+2*pi,true}; } int sum=0; sort(Cache+1,Cache+1+tot); for(int i=1;i<=tot;i++) if(Cache[i].ed)sum--; else ans=max(ans,++sum); } printf("%d\n",ans+1); } return 0; }
相关文章推荐
- 训练深度神经网络的时候需要注意的技巧
- XDU-1138 Z1+Z2 (水~复数相加) From 西电校赛网络赛
- 【bzoj4521】【CQOI2016】【手机号码】【数位dp】
- 优先级队列
- 全端工程师必备技能汇总
- 详解iOS App中UITableView的创建与内容刷新
- Anroid 加载图片方式一 使用SmartImageView
- ImageNet Classification with Deep Convolutional Neural Network(转)
- tcp协议案例
- poj 1283(递推ordp)
- Hash破解神器:Hashcat的简单使用
- 【GMT】使用变量的时候,空格不可以乱加
- 学习汇编的第一天,简单看了一下这门语言的一些小技巧
- python中sort()与sorted()区别
- eclipse中创建dynamic web project项目
- 数据挖掘环境配置(一)JDK在ubuntu 16.04下的安装配置
- 关于获取本机真实IP
- Android Notification常见样式总结
- Git入门介绍
- ZOJ-3944 People Counting From 第13届浙江省赛