首页 > 其他分享 >CF887E Little Brother

CF887E Little Brother

时间:2024-02-03 10:45:17浏览次数:35  
标签:cnt CF887E int db Little Brother ++ flag INF

题目传送门

迟到的模拟赛补题。

考场上二分写 shi 了,于是学习一下优秀的二分写法。

做法很显然,圆心必然在线段的中垂线上,预处理与每个圆相交的圆心的在中垂线上的范围,打到数轴上,最后扫描线。

自己写时对二分预处理圆心范围的讨论过于复杂,结合计算几何的知识,运用同向法可大大减少分讨难度。

#include<bits/stdc++.h>
#define db double
using namespace std;

const int N=1e5+10;
const db pi=acos(-1),eps=1e-8,INF=1e12;

int sign(db x){return x<eps? (-x<eps? 0:-1):1;}
struct Point
{
	db x,y;
	Point operator + (const Point &B) const
	{return (Point){x+B.x,y+B.y};}
	Point operator - (const Point &B) const
	{return (Point){x-B.x,y-B.y};}
	Point operator * (const db &B) const
	{return (Point){x*B,y*B};}
	Point operator / (const db &B) const
	{return (Point){x/B,y/B};}
	db operator | (const Point &B) const
	{return (x*B.x)+(y*B.y);}
	db operator ^ (const Point &B) const
	{return (x*B.y)-(y*B.x);}
};
db dis(Point A,Point B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}

int n;
db R,ans=INF;
Point A,B,C,k,P;
struct seq{db x;int op;}q[N<<1];  int cnt;

db find1(Point P,bool flag)
{
	db lo=-INF,hi=INF;
	for(int i=1; i<=80; i++)
	{
		db mid=(lo+hi)/2.000;
		Point O=C+(k*mid);
		if((dis(P,O)-R>dis(A,O))^flag)
			lo=mid;
		else
			hi=mid;
	}
	return lo;
}

db find2(Point P,bool flag)
{
	db lo=-INF,hi=INF;
	for(int i=1; i<=80; i++)
	{
		db mid=(lo+hi)/2.000;
		Point O=C+(k*mid);
		if((dis(A,O)-dis(P,O)>R)^flag)
			hi=mid;
		else
			lo=mid;
	}
	return hi;
}

int main()
{
	scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);
	C=(A+B)/2.000;
	k=(B-A)/dis(A,B);  k=(Point){-k.y,k.x};

	scanf("%d",&n);
	for(int i=1; i<=n; i++)
	{
		scanf("%lf%lf%lf",&P.x,&P.y,&R);
		bool flag=((P-A)^(B-P))>0;
		q[++cnt]={find1(P,flag),flag?-1:1};
		q[++cnt]={find2(P,flag),flag?1:-1};
	}
	q[++cnt]={0,0};  q[++cnt]={-INF,0};  q[++cnt]={INF,0};

	sort(q+1,q+1+cnt,[](seq A,seq B){return A.x<B.x;});

	int sum=0;
	for(int i=1; i<=cnt; i++)
	{
		if(!sum)
			ans=min(ans,fabs(q[i].x));
		sum+=q[i].op;
		if(!sum)
			ans=min(ans,fabs(q[i].x));
	}

	Point O=C+(k*ans);
	printf("%.10lf\n",dis(A,O));

	return 0;
}

标签:cnt,CF887E,int,db,Little,Brother,++,flag,INF
From: https://www.cnblogs.com/xishanmeigao/p/18004403

相关文章

  • Solution - Little Elephant and LCM & 之前学组合的一点疯话
    \(n\)个元素分成\(m\)份,每份不能为空,在\(n-1\)个空中插入\(m-1\)个板子,方案数\(C_{n-1}^{m-1}\)。为空则加上\(m\)个元素来垫着,就转化为上一个,然后就是\(C_{m-n+1}^{m-1}\)。所以为什么我之前不会插板?我是傻逼吗?然后突然发现,之前一直以为Gameswit......
  • 英语一课一练一年级扩展阅读03the Little Mermaid-小美人鱼
    PDF格式公众号回复关键字:YYYKYLY03记忆树1Hello,everybody.I’mAriel,thelittlemermaid.翻译大家好.我是Ariel,小美人鱼简化记忆美人鱼句子结构1打招呼(Greeting):"Hello,everybody."是一个简短的问候语,使用"Hello"向大家问好,"everybody"是名词短语,作为"......
  • 数据的存储--->【大小端字节序】(Big Endian)&(Little Endian)
    博主主页:@威化小餅干......
  • CodeForces 887E Little Brother
    洛谷传送门CF传送门根据初中数学知识,圆心在\(AB\)线段的中垂线上。又因为给定圆与\(AB\)线段所在直线不交,所以圆心在中垂线的一端极远处完全包含这个给定圆,在另一端极远处与这个给定圆相离。而具体在哪一端只与圆心在\(AB\)的左侧还是右侧有关。因此可以二分找到与给......
  • CF1333A [Little Artem]
    Problem题目简述给你一个\(n\timesm\)的方格,构造一个方案,使得方案中\(B=W+1\)。\(B\):相邻的格子有至少一个白色格子的黑色格子的个数。\(W\):相邻的格子有至少一个黑色格子的白色格子的个数。思路分奇偶讨论。\(n\timesm\)是偶数:构造一张黑、白相间的矩阵,左上......
  • little information
    SmartBear注册:Account=lsy283718040免费api使用https://blog.csdn.net/zlfjavahome/article/details/127983226https://api.oioweb.cn/ P3210.Postman项目实战以及集合newman和Jenkins持续集成(finishedlistening)https://www.bilibili.com/video/BV11K4y1J7sh/?p=32&spm......
  • Little Victor and Set 题解
    LittleVictorandSet题目大意在\([l,r]\)中选不超过\(k\)个相异的数使得异或和最小,输出方案。思路分析分类讨论:当\(k=1\)时:显然选\(l\)是最优的。当\(r-l+1\le10\)时:直接\(O(n2^n)\)暴力枚举每个数选或不选即可。(判了这个之后后面的很多讨论会简单很......
  • CF258D Little Elephant and Broken Sorting 题解
    题意给定一个长度为\(n\)的排列\(a\)和\(m\)个形如\(\left(x,y\right)\)的操作,每次操作有\(50\%\)的概率交换\(a_x,a_y\),求最终排列的期望逆序对数。(\(1\len,m\le5000\))。题解首先转化答案\[\text{Ans}=\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{......
  • CF276C Little Girl and Maximum Sum 题解
    题目链接题目大意通过修改序列\(a\)中的数的顺序,使\[\sum_{i=1}^q\sum_{j=l}^ra[j]\]最大,并输出它的值。思路一道简单贪心\(+\)差分,通过差分的优秀的\(O(1)\)区间修改能力帮助我们求出每个位置在询问中询问的次数,进行排序,最后次数较多的就让值较大的数来,以此类推。AC......
  • the-little-prince-reading-notes
    《小王子》读书笔记Created:2023-06-04T09:09+08:00Published:2023-06-19T09:08+08:00Categories:ReadingNotes第26章关于生离死别的印象深刻,water、bell……Onthe31stofJuly,1944,Saint-Exupéryleftforhislastmission.HisairplanewasdestroyedbyGe......