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;
    }
    
  • 相关阅读:
    经典分水岭算法的 C++ 实现
    一个简易的键盘按键测试程序
    工程优化方法中的“最速下降法”和“DFP拟牛顿法”的 C 语言实现
    基于哈夫曼编码的压缩解压程序(C 语言)
    博客选择:博客园 or CSDN
    Spring总结
    CSS总结
    EL表达式总结
    Jdbc总结
    hibernate总结
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/11107676.html
Copyright © 2011-2022 走看看