您的位置:首页 > 其它

hdu 5626 Clarke and points 最大曼哈顿距离

2016-02-14 15:06 225 查看
题目:点击打开链接

题意:给n(<=10^6)个点,求两点的最远曼哈顿距离。

分析:这题和poj2926那题一样。

|xi−xj|+|yi−yj|,拆绝对值可以得到:

正正:xi−xj+yi−yj=(xi+yi)−(xj+yj)

负负:−xi+xj−yi+yj=(−xi−yi)−(−xj−yj)

正负:xi−xj−yi+yj=(xi−yi)−(xj−yj)

负正:−xi+xj+yi−yj=(−xi+yi)−(−xj+yj)

所以只要维护最大值和最小值就可以了,至于符号可以用二进制枚举

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int N=1000000+5;
#define INF 20000000000;
long long seed;
int n;
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);
}
ll f
[2];
int main()
{
// freopen("f.txt","r",stdin);
ios_base::sync_with_stdio(0);
int T;
scanf("%d",&T);
while(T--){
cin >> n >> seed;
for (int i = 0; i < n; i++)
f[i][0] = rand(-1000000000, 1000000000),
f[i][1] = rand(-1000000000, 1000000000);
long long ans=0;
for (int k = 0; k < (1 << 2); k++){
long long a = -2000000000;
long long b = 2000000000;
for (int i = 0; i < n; i++)
{
ll temp = 0;
for (int j = 0; j < 2; j++)
if(k>>j &1)temp+=f[i][j];
else temp-=f[i][j];
a = max(a, temp);
b = min(b, temp);
}
ans = max(ans, a - b);
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: