zoukankan      html  css  js  c++  java
  • 洛谷P3964松鼠聚会

    题目

    题意:求最小的从某一个点到其余点的切比雪夫距离和。

    将一个图中的((x,y))坐标转到新坐标((x+y,x-y))后,图中的曼哈顿距离就是新图中的切比雪夫距离,

    证明:分类讨论,

    1.(x2>x1,y2>y1时,x2-x1+y2-y1=x2+y2-(x1+y2))就是新坐标的X差。

    2.(x2>x1,y2<y1时,x2-x1+y1-y2=x2-y2-(x1-y1))就是新坐标的Y差。

    其余情况加绝对值。

    然后新图中的坐标((X,Y))转回旧坐标后,有(2x=X+Y,2y=X-Y)

    然后可以用曼哈顿距离求解。

    易得:

    (i)到各个节点的曼哈顿距离等于(sum_{k=1}^{k=n}~(x[k]-x[i])+sum_{k=1}^{k=n}~(y[k]-y[i]))在x,y数组递增的情况下。

    先处理(△x)的情况,

    原式=(x[i]-x[1]+x[i]-x[2]...... + x[i]-x[i] + x[i+1]-x[i]+x[i+2]-x[i]......+x[n]-x[i])

    ​ =(i*x[i]-Sum[i]-(n-i)*x[i]+Sum[n]-Sum[i])

    (△y)同理。

    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define int long long
    using  namespace std;
    int sumx[1010000], sumy[10010000];
    int x[1001000], y[1001000];
    int datax[1001000], datay[1001000];
    
    int n, minn = 9223372036854775807;
    signed main()
    {
     	scanf("%lld", &n);		
     	for (int i = 1, x1, y1; i <= n; i++)
     		scanf("%lld%lld", &x1, &y1), x[i] = datax[i] = x1 + y1, y[i] = datay[i] = x1 - y1;
     	sort(datax + 1, datax + 1 + n);	
     	sort(datay + 1, datay + 1 + n);	
     	for (int i = 1; i <= n; i++)	
     		sumx[i] = sumx[i - 1] + datax[i], sumy[i] = sumy[i - 1] + datay[i];
     	for (int i = 1; i <= n; i++)
     	{
     		int ans = 0;
     		int idx = lower_bound(datax + 1, datax + 1 + n, x[i]) - datax;
     		int idy = lower_bound(datay + 1, datay + 1 + n, y[i]) - datay;
    // 		printf("%d %d
    ", idx, idy);
     		ans += idx * datax[idx] - sumx[idx] - (n - idx) * datax[idx] + sumx[n] - sumx[idx];
     		ans += idy * datay[idy] - sumy[idy] - (n - idy) * datay[idy] + sumy[n] - sumy[idy];
     		minn = min(minn, ans);
    	}
     	printf("%lld", minn / 2); 
       	return 0;
    }
    
  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/11107676.html
Copyright © 2011-2022 走看看