给你红点蓝点,找一个最大的圆,圆里没有蓝点并且至少有一个红点。边界可算可不算。

一开始没看懂题解,想了好久(一整天)才想明白是枚举弦上点二分半径check角度,看了下clj的代码发现思路都一样就开始写了。

借鉴了一下clj的代码。

调了一个多小时。

几个注意点:看到好多 random_shuffle 的,我没有,也感觉没什么必要。(另外cjl的代码去掉random_shuffle好像会WA。。。)

极角排序之后可能会遇到很多很多点全在一个角上,这个时候如果排序的话会麻烦,比方说我们要先减后加(哪里麻烦了啊???)

所以我每次check是不是扫完了完整的一段,也可以理解成我们扫角度不扫点。

小优化,每次二分先check ans,然后把l设成ans。

关于怎么求角的范围:两个圆夹起来就是了,初中解析几何?

千万不要把二分的eps设成1e-8,不然你会在test5tle到自闭并且还根本不知道哪里T了。

(感冒摸了三天鱼了。不过这题收获还蛮大的)

 #include <bits/stdc++.h>
#define rep(x) for(int i=0;i<x;i++)
#define mk(a,b) make_pair(a,b)
using namespace std;
typedef double db;
const db eps=1e-;
const db pi=acos(-);
int sign(db k){
if (k>eps) return ; else if (k<-eps) return -; return ;
}
int cmp(db k1,db k2){return sign(k1-k2);}
struct point{
db x,y;
point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
point operator * (db k1) const{return (point){x*k1,y*k1};}
point operator / (db k1) const{return (point){x/k1,y/k1};}
int operator == (const point &k1) const{return cmp(x,k1.x)==&&cmp(y,k1.y)==;}
// 逆时针旋转
point turn(db k1){return (point){x*cos(k1)-y*sin(k1),x*sin(k1)+y*cos(k1)};}
bool operator < (const point k1) const{
int a=cmp(x,k1.x);
if (a==-) return ; else if (a==) return ; else return cmp(y,k1.y)==-;
}
db abs(){return sqrt(x*x+y*y);}
db abs2(){return x*x+y*y;}
db dis(point k1){return ((*this)-k1).abs();}
db getw(){return atan2(y,x);}
int getP() const{return sign(y)==||(sign(y)==&&sign(x)==-);}
};
db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
db slove(db S){
if(S<)S+=*pi;
else if(S>=*pi) S-=*pi;
return S;
}
point r[],b[];
vector<point> p;
int n,m;
vector<pair<db,int>> g;
bool check(int id,db R){
g.clear();
point o = p[id];
rep(n+m){
if(i==id)continue;
point tmp = p[i];
db d = tmp.dis(o);
if(cmp(d,R*)>=)continue;
db alf = acos(d//R);
db delta = atan2(tmp.y-o.y,tmp.x-o.x);
db l = slove(delta-alf),r=slove(delta+alf);
if(l<r){
g.push_back(mk(l,i<n?:));
g.push_back(mk(r,-(i<n?:)));
}else{
g.push_back(mk(l,i<n?:));
g.push_back(mk(*pi,-(i<n?:)));
g.push_back(mk(,i<n?:));
g.push_back(mk(r,-(i<n?:)));
}
}
if(id<n)g.push_back(mk(,id<n?:)),g.push_back(mk(*pi,-(id<n?:)));
sort(g.begin(),g.end());
int rn=,bn=;
rep(g.size()){
if((i==g.size()-||g[i].first!=g[i+].first)&&rn>&&bn<=)return true;
if(abs(g[i].second)==)
bn+=g[i].second;
else
rn+=g[i].second/;
}
return false;
}
//枚举弦上点,二分半径,check角度范围,判断是否可行
int main(){
//freopen("zibi.in","r",stdin);
scanf("%d%d",&n,&m);
rep(n) scanf("%lf%lf",&r[i].x,&r[i].y),p.push_back(r[i]);
rep(m) scanf("%lf%lf",&b[i].x,&b[i].y),p.push_back(b[i]);
bool f=;
rep(n+m)
if(check(i,1e15))
//return 0*printf("%d -1\n",i);
return *printf("-1\n");
db ans = ;
//random_shuffle(p.begin(),p.begin()+n);
//random_shuffle(p.begin()+n,p.end());
for(int i=;i<n+m;i++){
db l=ans,r=1e9;
if(check(i,ans)) {
while (l + eps < r) {
db mid = (l + r) / ;
if (check(i, mid))
l = mid;
else r = mid;
}
ans = l;
// printf("%d %.11f\n",i,ans);
}
}
printf("%.11f\n",ans);
}
/** */
/** */
												

cf 744D的更多相关文章

  1. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  2. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  3. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  4. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  5. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  6. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  7. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  8. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

  9. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

随机推荐

  1. BFS 模拟队列(水题)

    BFS 这道题 觉得比较适合BFS新手入门写,也许大家都以为最入门 的BFS题是在二维图上搜索,但是这道题是线性搜索,更加简单 POJ 3278 Catch That Cow Time Limit:  ...

  2. noip2018游(AFO)记

    Day 0 到学车了,已经差不多四点了,领完一小袋比赛要用的就匆匆回了宾馆. 话说之前看地图的时候我们的宾馆最远,而且名字听起来并没有怎么高大上, 一看隔壁度豪大酒店就感觉应该比我们的酒店好.然鹅到了 ...

  3. luoguP1373 小a和uim之大逃离

    DP专题 题目链接 思路 \(f[i][j][a][b][0/1]\)表示在\((i,j)\)这个格子,小a有a滴魔液,他的伙伴有b滴,上一步是小a(0)或者他的伙伴(1)吸取的魔液. (显然)数组开 ...

  4. Java_异常以及处理

    目录 JAVA异常 异常的处理机制 自定义异常 写了一天的bug,来try...catch...finally了解一下.异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. ...

  5. C# 关于X86/X64/AnyCpu 的关系

    电脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系 ...

  6. VIM 编辑器

    可视化模块 进入vi/vim编辑器,按CTRL+V进入可视化模式(VISUAL BLOCK) 2 移动光标上移或者下移,选中多行的开头,如下图所示 3 选择完毕后,按大写的的I键,此时下方会提示进入“ ...

  7. 马拉车算法——求回文子串个数zoj4110

    zoj的测评姬好能卡时间.. 求回文子串的个数:只要把p[i]/2就行了: 如果s_new[i]是‘#’,算的是没有中心的偶回文串 反之是奇回文串 /* 给定两个字符串s,t 结论:s,t不相同的第一 ...

  8. Spring Bean装配

    1. Bean注入三种方式: A. 包扫描 + 组件标注注解(@Controller/@Service/@Repository/@Component),适用场景:自己写的类: B. @Bean或xml ...

  9. Redis实战 - 3.Hash

    hash Redis的Hash有点像一个对象(object),一个Hash里面可以存多个Key-Value对作为它的field,所以它通常可以用来表示对象. Hash里面能存放的值也能作为String ...

  10. OpenCV函数学习:alignPtr对齐指针

    转载地址:https://www.tuicool.com/articles/q2QrQr 在某些架构上,只有能被指定数(如4,16)整除的内存地址才能够被访问,否则程序会crash,或者出现错误的结果 ...