[ABC419C] King's Summit

题面-[ABC419C] King's Summit

算法关键词:思维题,数学

思维题,很有意思。
首先所有人肯定会汇聚到同一个格子,读完题面后发现和经典搜索题非常像,那么不如就从搜索的角度开始想。
思路1:搜索
搜索肯定要先确定起点和终点,但想找到这个终点格子的位置似乎并不是很简单。再看一眼数据范围,高达 \(10^9\)!显然不可能。

思路2(正解)
既然所有人要去同一个格子,那么显然,离格子最远的人,到达这个格子所需要的时间最长。同时我们还知道,显然这个格子应该在所有点的 “中间” 位置(因为需要和所有格子的距离最近)。所以我们可以知道,到达这个格子最慢的\(4\) 个点一定是 “对角线” 的 \(4\) 个点,也就是最左上、左下、右上、右下\(4\) 个点。而因为这两个人相隔最远,相遇的位置也应该在链接两个人线段的中点处。直接比较大小选出相距最远的两个点即可。
代码非常简洁,时间复杂度达到了惊人的\(O(n)\)且瓶颈在输入,主要难点在于思维。

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

int x[200010],y[200010];

int main(){
	int n;
	cin>>n;
	int maxx=0,minx=0x3f3f3f3f,maxy=0,miny=0x3f3f3f3f;
	for(int i=1;i<=n;i++){
		cin>x[i]>>y[i];
		maxx=max(maxx,x[i]);
		minx=min(minx,x[i]);
		maxy=max(maxy,y[i]);
		miny=min(miny,y[i]);
	}
	int a=(minx+maxx)/2,b=(miny+maxy)/2,ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,max(abs(x[i]-a),abs(y[i]-b)));
	}
	cout<<ans;
	return 0;
}

posted @ 2025-08-27 10:13  lnquoein  阅读(5)  评论(0)    收藏  举报