首页 > 其他分享 >ABC314EX 题解

ABC314EX 题解

时间:2023-08-22 21:44:19浏览次数:38  
标签:AB return overrightarrow 题解 DB AP ABC314EX sb

模拟退火的题解。

题目的难点在于如何计算点到所有线段的距离。

我们可以通过求线段的直线解析式,然后计算与其垂直的直线的斜率,将随机出来的点带入求得直线解析式,然后求两直线交点,判断是否在线段上进行分讨即可,但是我可能写挂了,所以改成用的向量。

我们看到有三种情况,我们可以分别来讨论。

当为图 (a) 的情况时,我们可以用叉积来计算,我们都知道叉积的几何意义是以两个向量为边的平行四边形的面积,设向量 \(\overrightarrow{AB} (x1,y1),\overrightarrow{AP} (x2,y2))\) 则我们要求的 \(PC\) 为:

\[\frac{(\overrightarrow{AB}\cdot \overrightarrow{AP}) }{|\overrightarrow{AB} |}=\frac{x1\times y2 - x2 \times x1}{|\overrightarrow{AB} |} \]

当为图 (b) 的情况时,我们要的就是 \(|\overrightarrow{BP} |\)。

当为图 (c) 的情况时,我们要的就是 \(|\overrightarrow{AP} |\)。

然后我们利用点乘来判断上述三种情况。

若为 (b) 的情况,$\overrightarrow{BP} $ 在 $\overrightarrow{AB} $ 上的投影向量与 $\overrightarrow{AB} $ 同向;若为 (c) 的情况,$\overrightarrow{AP} $ 在 $\overrightarrow{AB} $ 上的投影向量与 $\overrightarrow{AB} $ 异向。

设 $\overrightarrow{AB}(x1,y1),\overrightarrow{AP}(x2,y2),\overrightarrow{BP}(x3,y3) $。

所以得出结论:

\[d = \left\{\begin{matrix} |\overrightarrow{AP} | & x1 \times x2 + y1 \times y2 < 0\\ |\overrightarrow{BP} | & x1 \times x3 + y1 \times y3 > 0\\ |\overrightarrow{AC} | & others \end{matrix}\right. \]

然后我们就有了一个快速的求以当前点为圆心符合要求的圆半径最小是多少了。

后面就是正常的退火流程了,然后就是痛苦的调参,建议目标温度调小一点,降温系数尽量接近 \(1\) 一点,这样能保证精度。

code:


#include <bits/stdc++.h>

#define int long long
#define DB double
#define N 10010

using namespace std;

int n;
DB ax, ay, ans;
 
struct sb
{
	DB x, y;
	inline DB len(){return sqrt(x * x + y * y);}
} a[N], b[N];
 
inline sb operator + (const sb &a, const sb &b){return (sb){a.x + b.x, a.y + b.y};}
inline sb operator - (const sb &a, const sb &b){return (sb){a.x - b.x, a.y - b.y};}
inline DB dot(sb a, sb b){return a.x * b.x + a.y * b.y;}
inline DB cross(sb a, sb b){return a.x * b.y - a.y * b.x;}
 
inline DB dis(sb p, sb a, sb b)
{
	sb x = p - a, y = p - b, z = b - a;//向量AP,BP,AB,终点坐标减起点坐标
	if(dot(x, z) < 0) return x.len();//AP在AB的投影向量与AB方向相反,AP向量的模
	else if (dot(y, z) > 0) return y.len();//BP在AB的投影向量与AB方向相同,BP向量的模
	else return fabs(cross(x, z)) / z.len();//利用叉积计算距离
}
 
inline DB calc(DB x, DB y)
{
	DB ans = -1e18;
	for (int i = 1; i <= n; ++i)
		ans = max(ans, dis((sb){x, y}, a[i], b[i]));
	return ans;
}
 
inline void SA()
{
    DB T = 1e3;
    while(T > 1e-13)
    {
		DB tx = ax + (DB)(2 * rand() - RAND_MAX) / RAND_MAX * T;
		DB ty = ay + (DB)(2 * rand() - RAND_MAX) / RAND_MAX * T;
		DB res = calc(tx, ty);
		if(res < ans) ans = res, ax = tx, ay = ty;
		else if(exp((ans - res) / T) * RAND_MAX > rand()) ax = tx, ay = ty;
        T *= 0.9996;
	}
    return ;
}
 
signed main()
{
	srand(time(0));
	cin >> n;
	for(int i = 1; i <= n; i ++)
    {
		cin >> a[i].x >> a[i].y >> b[i].x >> b[i].y;
		ax += (a[i].x + b[i].x) / 2;
		ay += (a[i].y + b[i].y) / 2;
	}
	ax /= n, ay /= n;
	ans = calc(ax, ay);
	while((DB)clock() / CLOCKS_PER_SEC < 1.5) SA();
	printf("%.10lf\n", ans);
	return 0;
}

AC 记录

标签:AB,return,overrightarrow,题解,DB,AP,ABC314EX,sb
From: https://www.cnblogs.com/Multitree/p/17649775.html

相关文章

  • YACS 2023年8月月赛 甲组 T3 金字塔分割 题解
    看到这题,自然的想到DP啦!如果设$f_{i,j}$为到第$i$个位置前面的都合法且最后一段和为$j$是否可行,那么转移十分显然,但是状态会炸。此时我们考虑在状态上进行优化来减少时间,把$f_i$设为到第$i$个位置分段数量最多的情况下且最后一段和最少的和,以及能分成几段就好了。......
  • [USACO JAN 2011]交通灯 题解
    题意很清晰,直接跑SPFA求最短路。只是我们在松弛操作时,需要注意从\(u\)是否可以到达\(v\)。怎么判断呢?请移步下面三个部分。Part1先解释一下,下面点\(i\)的信息分别为以下变量:color表示颜色,1表示蓝色,0表示紫色num表示初始状态持续时间t1表示蓝色状态持续时间......
  • CF1818 & 1817 题解
    Div2A容易发现最后要存活下来一定要每次和\(1\)号做出相同的选择,直接数就好了.Div2B容易发现当\(n\)为奇数的时候无解。考虑\(n\)为偶数的情况怎么构造,有一种方案是在\(a_i=i\)的基础上调整,交换一下\(a_{2i-1}\)和\(a_{2i}\),证明考虑左右端点的奇偶性。Div2C&......
  • P9236 [蓝桥杯 2023 省 A] 异或和之和题解
    思路题目给我们一个数组\(a\),那么我们可以算出其异或前缀和\(sum\)。我们知道,算出\([l,r]\)的异或和可以这样计算:\(sum_r\oplussum_{l-1}\)。那么问题就转换为了\(sum_{0\simn}\)这\(n+1\)个数字两两异或之和(当然\(sum_i\oplussum_j\)和\(sum_j\oplussum......
  • 8.22 [CSP-S 2021] 交通规划 题解
    #include<bits/stdc++.h>usingnamespacestd;usingpii=pair<int,int>;constexprintN=3e5+5,S=2e3+5,K=1e2+5,INF=0x3f3f3f3f;intn,m,T,poi[N];inthed[N],nxt[N<<2],rch[N<<2],val[N<<2],idx;vo......
  • P3089 题解
    P3089令\(f_1[i][j]\)表示向右跳,从\(j\)跳到\(i\)的最大总得分,有状态转移方程:\[f_1[i][j]=\displaystyle\max_{k<j<i,x_j-x_k\lex_i-x_j}\{f_1[j][k]+s_i\}\]将\(s_i\)看作定值,整理得\(f_1[i][j]=\displaystyle\max_{k<j<i,x_j-x_k\lex_i-x_j}\{f_1[j][......
  • P2572 序列操作 题解
    link。对平衡树的懒标记的应用题,其实和线段树也差不多。如果不考虑取反操作,那维护操作\(5\)就需要知道当前区间答案,当前区间前缀和后缀,因为在push_up时我们当前区间的答案肯定等于左区间的答案,右区间的答案以及左区间的后缀加上右区间的前缀这三者间的最大值。但与线段树不......
  • AGC032 A-D题解
    A最后一次插入的数的值与位置一定相同考虑倒着做每次从左往右扫一遍当遇到a[i]==i时将此数删除并跳出B当n为5时构造出的图如下(图形编辑器(csacademy.com))那么我们猜想当n为奇数时将n与其他点连边i与除了n-i的其他点连边证明:n的邻接点的编号之和为(n......
  • iOS开发之--获取验证码倒计时及闪烁问题解决方案
    大家在做验证码的时候一般都会用到倒计时,基本上大家实现的方式都差不多,先贴出一些代码来..-(void)startTime{__blockinttimeout=59;//倒计时时间dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);dispatch_source......
  • 国标GB28181视频平台EasyGBS国标平台激活码授权提示“授权失败”的问题解决方案
    EasyGBS平台是基于国标GB28181协议的视频云服务平台,支持多路设备接入,并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等多种格式的视频流。平台可为大数据等综合性监管平台提供极强的视频能力,既能作为能力平台为业务层提供接口调用,也可作为业务平台使用。有用户反馈,现场Easy......