hdoj 5626 Clarke and points (曼哈顿距离)

本文介绍了一种高效计算给定点集间最大曼哈顿距离的方法,通过去除绝对值运算并采用四组线性组合的方式,实现了快速寻找最优解的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Clarke and points

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 433    Accepted Submission(s): 304


Problem Description
Clarke is a patient with multiple personality disorder. One day he turned into a learner of geometric.
He did a research on a interesting distance called Manhattan Distance. The Manhattan Distance between point A(xA,yA) and point B(xB,yB) is |xAxB|+|yAyB| .
Now he wants to find the maximum distance between two points of n points.
 

Input
The first line contains a integer T(1T5) , the number of test case.
For each test case, a line followed, contains two integers n,seed(2n1000000,1seed109) , denotes the number of points and a random seed.
The coordinate of each point is generated by the followed code.

```
long long seed;
inline long long rand(long long l, long long r) {
  static long long mo=1e9+7, g=78125;
  return l+((seed*=g)%=mo)%(r-l+1);
}

// ...

cin >> n >> seed;
for (int i = 0; i < n; i++)
  x[i] = rand(-1000000000, 1000000000),
  y[i] = rand(-1000000000, 1000000000);
```
 

Output
For each test case, print a line with an integer represented the maximum distance.
 

Sample Input
  
2 3 233 5 332
 

Sample Output
  
1557439953 1423870062
 

Source
 

题意:按照题意求出每点的坐标,然后求出最大的曼哈顿距离

思路:嗯,题目数据挺大的,按部就班的算一定超时,

看了人家博客,思路妙,

思路就是去绝对值符号,然后就有四种情况:

(x1-y2)-(x2-y2); (x1+y1)-(x2+Y2); (-x1+y1)-(-x2+y2); (-x1-y1)-(-x2-y2). 减号左右类似,所以对每个(x,y)求出四种情况的值,然后求出最值

代码;

#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;

LL n,seed;
struct node
{
	LL x,y; 
}a[1000010];
LL rand(LL l, LL r) { 
  static LL mo=1e9+7, g=78125; 
  return l+((seed*=g)%=mo)%(r-l+1); 
} 
int main()
{
	int t;
	scanf("%d",&t);	
	while(t--)
	{
		scanf("%lld%lld",&n,&seed);
		for(int i=0;i<n;i++)
		{
			a[i].x = rand(-1000000000, 1000000000);
  			a[i].y = rand(-1000000000, 1000000000);
		}
		LL maxn[10],minn[10];
		for(int i=0;i<6;i++)
		{
			maxn[i]=-1e16;minn[i]=1e16;
		}
		for(int i=0;i<n;i++)
		{
			maxn[0]=max(maxn[0],a[i
			].x-a[i].y);
			maxn[1]=max(maxn[1],a[i].x+a[i].y);
			maxn[2]=max(maxn[2],-a[i].x+a[i].y);
			maxn[3]=max(maxn[3],-a[i].x-a[i].y);
			minn[0]=min(minn[0],a[i].x-a[i].y);
			minn[1]=min(minn[1],a[i].x+a[i].y);
			minn[2]=min(minn[2],-a[i].x+a[i].y);
			minn[3]=min(minn[3],-a[i].x-a[i].y);			
		}
		LL big=0;
		for(int i=0;i<4;i++)
		{
			big=max(big,maxn[i]-minn[i]);
		}
		printf("%lld\n",big);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值