HDU 5626 Clarke and points(最大曼哈顿距离)

Description
克拉克是一名精神分裂患者。某一天克拉克变成了一位几何研究学者。
他研究一个有趣的距离,曼哈顿距离。点A(xa,ya)和点B(xb,yb)的曼哈顿距离为|xa-xb|+|ya-yb|,现在他有n个这样的点,他需要找出两个点i, j使得曼哈顿距离最大。
Input
第一行是一个整数TT(1≤T≤5),表示数据组数。
每组数据第一行为两个整数n, seed(2≤n≤1000000,1≤seed≤10^​9),表示点的个数和种子。
n个点的坐标是这样得到的:
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
对于每组数据输出一行,表示最大的曼哈顿距离。
Sample Input
2
3 233
5 332
Sample Output
1557439953
1423870062
Solution
最大曼哈顿距离=max((xa+ya)-(xb+yb),(xa-ya)-(xb-yb))
所以只需要统计n个点的坐标中x+y,x-y的最大值最小值,做差后取最大值即可
Code

#include
#include
#include
using namespace std;
typedef long long ll;
#define maxn 1111111
#define INF 0x3f3f3f3f
int T,n;
ll seed,a1,a2,b1,b2;
ll rand(ll l,ll r) 
{
    ll mo=1e9+7,g=78125;
    return l+((seed*=g)%=mo)%(r-l+1);
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&seed);
        a1=b1=INF,a2=b2=-INF; 
        for(int i=0;i1000000000,1000000000);
            ll y=rand(-1000000000,1000000000);
            a1=min(a1,x+y),a2=max(a2,x+y);
            b1=min(b1,x-y),b2=max(b2,x-y);
        }
        ll ans=max(a2-a1,b2-b1);
        printf("%I64d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(HDU,杂题)