zoukankan      html  css  js  c++  java
  • Luogu P5098 Cave Cows 3

    题目大意

      有(n)个坐标((x_i, y_i)),求任意两个坐标之间的最大曼哈顿距离。
      (1 leq n leq 50000)(-1 imes 10^6 leq x_1,x_2,y_1,y_2 leq 1 imes 10^6)

    题解

      我们把(|x_1 - x_2| + |y_1 - y_2|)分成四种情况:

    [egin{aligned} &|x_1 - x_2| + |y_1 - y_2| = x_1 - x_2 + y_1 - y_2 = (x_1 + y_1) - (x_2 + y_2) &(x_1 geq x_2, y_1 geq y_2) \ &|x_1 - x_2| + |y_1 - y_2| = x_1 - x_2 + y_2 - y_1 = (x_1 - y_1) - (x_2 - y_2) &(x_1 geq x_2, y_1 < y_2) \ &|x_1 - x_2| + |y_1 - y_2| = x_2 - x_1 + y_1 - y_2 = -((x_1 - y_1) - (x_2 - y_2)) &(x_1 < x_2, y_1 geq y_2) \ &|x_1 - x_2| + |y_1 - y_2| = x_2 - x_1 + y_2 - y_1 = -((x_1 + y_2) - (x_2 + y_2)) &(x_1 < x_2, y_1 < y_2) end{aligned}]

      显然分别求(x_i - y_i)的最大值和最小值即可。

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int n;
    int x, y;
    int maxp = -(1 << 30), minp = 1 << 30, maxd = -(1 << 30), mind = 1 << 30;
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i)
        {
            scanf("%d%d", &x, &y);
            minp = min(minp, x + y);
            maxp = max(maxp, x + y);
            mind = min(mind, x - y);
            maxd = max(maxd, x - y);
        }
        printf("%d", max(maxp - minp, maxd - mind));
        return 0;
    }
    

      当然我们把曼哈顿距离转化成切比雪夫距离。就是把每个

    [(x_i, y_i) ]

      转化成

    [(x_i + y_i, x_i - y_i) ]

      那么曼哈顿距离

    [|x_1 - x_2| + |y_1 - y_2| ]

      就可以转化成对应的切比雪夫距离

    [max { |(x_1 + y_1) - (x_2 + y_2)|, |(x_1 - y_1) - (x_2 - y_2)| } ]

      可以发现代码都是一样的。

  • 相关阅读:
    求周期串的最小正周期
    Manacher's Algorithm
    高精度
    找x的两个素数因子使x=pq(Pollard_Rho)
    Intersection is not allowed!
    类欧几里得
    分数规划
    'sessionFactory' or 'hibernateTemplate' is required
    Struts2的动态方法,及result跳转方式,全局结果以及默认的action的配置
    配置Struts2及Struts2访问servlet api的方式
  • 原文地址:https://www.cnblogs.com/kcn999/p/12238315.html
Copyright © 2011-2022 走看看