文章目录
Link: HDU 5626 Clarke and points
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 and point is .
Now he wants to find the maximum distance between two points of n points.
Input
The first line contains a integer , the number of test case.
For each test case, a line followed, contains two integers n,seed , 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
Translation
给你 N 个点的坐标,求出这 N 个点组成的点对之间曼哈顿距离最大值。
曼哈顿距离:
The Manhattan Distance between point and point is .
Analysis
一看到这题,很容易令人想起“平面最近点对”问题。但是实际上这题和那题没有丝毫关系……
其实可以观察这个曼哈顿距离公式:
那么去绝对值,我们可以分类讨论四种最大值情况:
经过变形,我们可以发现,完全可以令 ,那么答案就在 之中了。
Code
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1000005;
const long long INF=1e9;
int T,n,x[maxn],y[maxn];
long long seed;
long long A[maxn],B[maxn],maxa,mina,maxb,minb;
// A[i]=Xi+Yi;
// B[i]=Xi-Yi;
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);
}
inline void build(int n,int seed){
for (int i=0;i<n;i++)
x[i]=rand(-1000000000,1000000000),
y[i]=rand(-1000000000,1000000000),
A[i]=x[i]+y[i],maxa=max(maxa,A[i]),mina=min(mina,A[i]),
B[i]=x[i]-y[i],maxb=max(maxb,B[i]),minb=min(minb,B[i]);
}
inline void init(){
maxa=maxb=-INF;
mina=minb=INF;
}
inline int read(){
int ret=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
int main(){
T=read();
while (T--){
init();
n=read();seed=read();
build(n,seed);
printf("%lld\n",max(maxa-mina,maxb-minb));
}
return 0;
}