专栏文章

题解:AT_abc130_f [ABC130F] Minimum Bounding Box

AT_abc130_f题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mins2rkl
此快照首次捕获于
2025/12/02 07:26
3 个月前
此快照最后确认于
2025/12/02 07:26
3 个月前
查看原文

题意

平面上有 NN 个点,第 ii 个点的坐标是 (xi,yi)(x_i,y_i),每个点沿着 xx 轴或 yy 轴方向以 11 格每秒的速度移动。
  • 如果 di=Rd_i=R,第 ii 个点沿 xx 轴正方向移动;
  • 如果 di=Ld_i=L,第 ii 个点沿 xx 轴负方向移动;
  • 如果 di=Ud_i=U,第 ii 个点沿 yy 轴正方向移动;
  • 如果 di=Dd_i=D,第 ii 个点沿 yy 轴负方向移动;
找出 (xmaxxmin)×(ymaxymin)(x_{max}-x_{min})\times(y_{max}-y_{min}) 最小值;

思路

ansans(xmaxxmin)×(ymaxymin)(x_{max}-x_{min})\times(y_{max}-y_{min})。题目给了一堆运动的点,由于这些点都是运动的,则每个时刻找出的 ansans 的值都不同。且每个点的方向不同,则以 xminx_{min} 为例,他的情况就有很多种,具体的其他题解已经很清楚了。通过观察 ansans 的值,我们很容易发现他的值是可能先减少后增加(大概是这个意思),我们可以把 ansans 的值抽象成一个二次函数,再用三分法暴力求。

代码

CPP
#include <bits/stdc++.h>
using namespace std;
long long n;
long double dx[100007],dy[100007];
char f[100007][2];
long double check(long double tim)//计算给定时间mid下的面积值。
{
	long double xx=-1e18,xn=1e18,yx=-1e18,yn=1e18;
	for (long long i=1;i<=n;i++) 
	{
		long double x=dx[i],y=dy[i];
		if(f[i][0]=='U')y+=tim;
		if(f[i][0]=='D')y-=tim;
		if(f[i][0]=='L')x-=tim;
		if(f[i][0]=='R')x+=tim;
		xx=max(xx,x),xn=min(xn,x),yx=max(yx,y),yn=min(yn,y);
	}
	return (xx-xn)*(yx-yn);
}
int main() {
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++) 
		scanf("%Lf%Lf%s",&dx[i],&dy[i],f[i]);//注意要用 %Lf 不然精度不够。 
	//三分法
	long double l=0,r=2e8,midl=0,midr=0;
	for(long long i=0;i<500;i++)
	{
		midl=(l*2+r)/3,midr=(l+r*2)/3;
		if(check(midl)<check(midr)) r=midr;
		else l=midl;
	}
	printf("%.2Lf",check(midl));
	return 0;
}


评论

0 条评论,欢迎与作者交流。

正在加载评论...