zoukankan      html  css  js  c++  java
  • P3964 [TJOI2013]松鼠聚会

    给定n个点,求出一个点使得其他点到该点的切比雪夫距离和最小,输出这个答案。

    切比雪夫距离是取max的,不好计算。我们可以转化成曼哈顿距离,然后求和。对x,y两个坐标分开计算距离。

    曼哈顿距离是绝对值,要分类讨论,然后用前缀和优化下即可

    const int N = 1e5 + 79;
    lxl ans(1e18);
    int n;
    lxl x[N], y[N];
    lxl sx[N], sy[N];
    struct point {
    	lxl x, y;
    } p[N];
    
    int main() {
    	read(n);
    	rep(i, 1, n) {
    		int a,b;
    		read(a);
    		read(b);
    		x[i] = p[i].x = a+b;
    		y[i] = p[i].y = a-b;
    	}
    	
    	
    	std::sort(x + 1, x + n + 1);
    	std::sort(y + 1, y + n + 1);
    
    	rep(i, 1, n) {
    		sx[i] = sx[i - 1] + x[i];
    		sy[i] = sy[i - 1] + y[i];
    	}
    
    
    	rep(i, 1, n) {
    		lxl posx = std::lower_bound(x + 1, x + n + 1, p[i].x) - x;
    		lxl posy = std::lower_bound(y + 1, y + n + 1, p[i].y) - y;
    
    		lxl temp(0);
    		temp += posx * p[i].x - sx[posx] + (sx[n] - sx[posx]) - (n - posx) * p[i].x;
    		temp += posy * p[i].y - sy[posy] + (sy[n] - sy[posy]) - (n - posy) * p[i].y;
    
    		ans = min(ans, temp);
    	}
    	out(ans >> 1, '
    ');
    	return 0;
    }
    

    本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15499430.html

  • 相关阅读:
    作业,注册页面
    HTML表单
    用HTML制作简历
    多线程同步标记
    集合类
    多态 接口
    java 泛型讲解
    转型
    使用super关键字
    作业题
  • 原文地址:https://www.cnblogs.com/QQ2519/p/15499430.html
Copyright © 2011-2022 走看看