L. Machining Disc Rotors

题目求切割后圆上两点的最长距离,显然是圆边上的两点,n=100可以使用平方算法,对每个切割圆先判断是否外离内含,然后用余弦定理求出两交点与圆心连线的夹角,按顺时针标记为l,r,表示切割掉的弧,范围【0,2pi】,题目保证切割圆不会交叉,将弧按l排序,遍历求出留下来的弧,一个弧关于圆心的对称弧可以将l,r±pi来求得,最后n方判断对称弧是否与其他弧重叠(若重叠答案为直径),并求弧的左右端点和其他弧左右端点的距离,答案为最大值。
坑点是可能所有的切割圆都外离内含时容易挂掉,并且如果存在优弧则答案就是直径。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct P{double x,y;
}o1,o;
double l[110],r[110],ln[110],rn[110]; //[0.2pi) clockwise
double RR;
struct L{double l,r;bool operator <(L B)const{return l<B.l;}
}p[110],p2[110];
inline double cross(P A,P B,P C){return (A.x-C.x)*(B.y-C.y)-(B.x-C.x)*(A.y-C.y); //CA*CB
}
inline double dis(P A,P B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}
inline bool ck(double a,double b,double c){if(b>=a&&c>=a&&c<=b)return true;if(b<a&&(c<=b||c>=a))return true;return false;
}
double pi=acos(-1);
inline double f(double x){if(x>=pi)return x-pi;return x+pi;
}
inline double xc(double a,double b){double r=fabs(a-b);if(r>pi)r=2*pi-r;return sqrt(2*RR*RR*(1-cos(r)));
}
int n;
inline bool check(int i){if(p[i].l==-1)return false;for(int j=1;j<=n;j++){if(j==i)continue;if(p[j].l==-1)continue;if(ck(p[j].l,p[j].r,p[i].l)&&ck(p[j].l,p[j].r,p[i].r))return false;}return true;
}
int main(){int T,TT;o1.x=1;scanf("%d",&T);TT=T;while(T--){scanf("%d%lf",&n,&RR);bool fl=false;double ans=0;for(int i=1;i<=n;i++){double rr;P t;scanf("%lf%lf%lf",&t.x,&t.y,&rr);double d=dis(t,o);if(d>=rr+RR||(rr<RR&&d<=RR-rr)){p[i].l=-1;continue;}double mid=acos(t.x/d);if(t.y<0)mid=2*pi-mid;double re=acos((-rr*rr+RR*RR+d*d)/(2*RR*d));p[i].l=mid-re;if(p[i].l<0)p[i].l+=2*pi;p[i].r=mid+re;if(p[i].r>=2*pi)p[i].r-=2*pi;}int pr,cnt=0,ct=0; for(int i=1;i<=n;i++){if(check(i))p2[++ct]=p[i];}sort(p2+1,p2+ct+1);pr=ct;for(int i=1;i<=ct;i++){l[++cnt]=p2[pr].r;pr=i;r[cnt]=p2[i].l;ln[cnt]=f(l[cnt]);rn[cnt]=f(r[cnt]);ans=max(xc(l[cnt],r[cnt]),ans);double len=r[cnt]-l[cnt];if(len<0)len+=2*pi;if(len>=pi){ans=2*RR;break;}for(int j=1;j<cnt;j++){if(ck(l[j],r[j],ln[cnt])||ck(l[j],r[j],rn[cnt])||ck(ln[cnt],rn[cnt],l[j])||ck(ln[cnt],rn[cnt],r[j])){fl=true;ans=2*RR;break;}else {ans=max(xc(l[cnt],l[j]),ans);ans=max(xc(l[cnt],r[j]),ans);ans=max(xc(r[cnt],l[j]),ans);ans=max(xc(r[cnt],r[j]),ans);}}if(fl)break;}if(ans==0)ans=2*RR;printf("Case #%d: %.10f\n",TT-T,ans);}return 0;
}

L. Machining Disc Rotors相关推荐

  1. L Machining Disc Rotors

    L Machining Disc Rotors 题意: 圆心为(0,0)半径为R的圆,现在被被n个互不相交的圆切割(圆心和半径会给出),保证这n个彼此之间不会交叉,保证n个圆中不会有某个包含整个大圆的 ...

  2. 2018-2019 ACM-ICPC, Asia Shenyang Regional Contest题解

    以下所有AC题解代码来自"仙客传奇"团队. AC题数:4/13 CGJK A. Sockpuppets B. Sequences Generator C. Insertion So ...

  3. 2018 ACM-ICPC Asia Shenyang Regional Contest 题解(9 / 13)【每日亿题2021/2/24】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2018 ACM-ICPC Shenyang J)How Much Memory Your ...

  4. UOJ #277 BZOJ 4739 定向越野 (计算几何、最短路)

    UOJ #277 BZOJ 4739 定向越野 (计算几何.最短路) 手动博客搬家: 本文发表于20181208 14:39:01, 原地址https://blog.csdn.net/suncongb ...

  5. UOJ #277 BZOJ 4739 [清华集训2016]定向越野 (计算几何、最短路)

    手动博客搬家: 本文发表于20181208 14:39:01, 原地址https://blog.csdn.net/suncongbo/article/details/84891710 哇它居然显示出图 ...

  6. 论文笔记 EMNLP 2020|Graph Transformer Networks with Syntactic and Semantic Structures for Event Argument

    文章目录 1 简介 1.1 创新 2 方法 3 实验 1 简介 论文题目:Graph Transformer Networks with Syntactic and Semantic Structur ...

  7. codeforces 141D Take-off Ramps

    题意: 有一条起点为0,长度为L的跑道,有n个跳板,对于第i个跳板,在xi处开始起跳,但是必须在xi-pi ~ xi进行缓冲时间为pi,然后在ti的时间到达xi+di处,人可以往回走,但是跳板的方向是 ...

  8. 《牛津字典精华总结》- 初阶系列 - 字母 - C

    the Epilogue and Essential of 'Oxford Elementary Learner's Dictionary 2nd' 2008第一版总结,2011已经完全更新.完全解密 ...

  9. [COCI2009-2010#1] ALADIN

    [类欧几里得]aladin 题目描述: 给你 nnn 个盒子,有 qqq 个操作,操作有两种: 第一种操作输入格式为 1LRAB1\ \ L\ \ R\ \ A\ \ B1  L  R  A  B,表 ...

最新文章

  1. 张仰彪第二排序法_C语言中的最常用的两种排序算法你知道吗?
  2. 【eclipse】eclipse使用常见问题(持续更新)
  3. asp.net Page页面中的一个有用属性
  4. 【Python】多线程
  5. java矩形翻转_如何判断一个点在旋转后的矩形中
  6. python多线程图像识别_Python 多线程抓取图片效率对比
  7. python集合类型运算符_Python 数据类型和运算符
  8. 还不会回答Spring Boot和Spring MVC的关系?大厂Java高级面试官告诉你答案!
  9. Egret白鹭引擎简介麻将游戏开发流程
  10. bat脚本一键配置java开发环境
  11. 恒凯USB数据采集卡在国产麒麟操作系统下的应用(一)环境设置、采集卡驱动安装及C语言采集应用
  12. BF2地图下载 战地系列非官方单机地图集
  13. 如何在vue 中使用组件,以及组件通信的方式(父传子/子传父/兄弟传)
  14. 英文歌曲:What I Have Done(变形金刚第一部主题曲)
  15. “立体巴士”梦想,还是幻想
  16. L9ARM体系结构与接口技术--计算机硬件基础(day1)
  17. 触控科技CEO陈昊芝谈移动游戏市场趋势变化
  18. jQuery 经典表单应用
  19. win10系统怎么开启sql服务器,win10如何启动sql数据库服务器
  20. 运行npm run dev报错 internal/modules/cjs/loader.js:883 throw err;

热门文章

  1. echars 图表过渡动画设置
  2. 新版阿里云发送短信验证码详解
  3. 转:智能模糊测试工具 Winafl 的使用与分析
  4. 未来五年超1800亿元,域控中间件+智能驾驶软件市场爆发
  5. 去除有序和无序列表中前面的序号
  6. wepy安装完毕“不是内部或外部命令,也不是可运行的程序或批处理文件”
  7. python图案代码大全_Python练习代码实例65-一个最优美的图案
  8. java maven程序包不存在_Maven install 报错程序包不存在问题的解决方法
  9. 第01课:生活中的监听模式——一坑爹的热水器
  10. Django与postgres数据库的基本使用