HDU 4312 最小切比雪夫距离-转化成曼哈顿距离再分治
2015-08-03 18:10
369 查看
题意:二维空间,n个点,求以某点为起点到各点的最小切比雪夫距离
分析:
上一道题之前已经用“分治“思想在O(n)的时间内求出了n个点,以某点为起点到各点的最小曼哈顿距离,那么我们根据二维空间切比雪夫距离和曼哈顿距离的关系,可以把切比雪夫距离转化成曼哈顿距离,再直接用之前的方法即可。
二维空间:
曼哈顿距离 :d=|x1-x2|+|y1-y2|,到某点的曼哈顿距离为r的点组成一个边长为√2*r的正方形,且边与坐标轴成45度
切比雪夫距离:d=max(|x1-x2|,|y1-y2|),到某点的切比雪夫距离为r的点组成一个边长为2*r的正方形,且边与坐标轴平行
在二维平面我们可以发现边长为r的切比雪夫正方形旋转45度,就变成了边长为2*r的曼哈顿正方形,旋转公式是:x'=x+y,y'=y-x。所以我们只需在上面一题的代码中加上这个坐标转化,结果输出ans/2就行了
代码:
分析:
上一道题之前已经用“分治“思想在O(n)的时间内求出了n个点,以某点为起点到各点的最小曼哈顿距离,那么我们根据二维空间切比雪夫距离和曼哈顿距离的关系,可以把切比雪夫距离转化成曼哈顿距离,再直接用之前的方法即可。
二维空间:
曼哈顿距离 :d=|x1-x2|+|y1-y2|,到某点的曼哈顿距离为r的点组成一个边长为√2*r的正方形,且边与坐标轴成45度
切比雪夫距离:d=max(|x1-x2|,|y1-y2|),到某点的切比雪夫距离为r的点组成一个边长为2*r的正方形,且边与坐标轴平行
在二维平面我们可以发现边长为r的切比雪夫正方形旋转45度,就变成了边长为2*r的曼哈顿正方形,旋转公式是:x'=x+y,y'=y-x。所以我们只需在上面一题的代码中加上这个坐标转化,结果输出ans/2就行了
代码:
#include<iostream> #include<cstring> #include<algorithm> #define INF 1000000000000007 using namespace std; struct node{ long long x,y; long long sum; }a[100005]; bool cmp1(node a,node b) { return a.x<b.x; } bool cmp2(node a,node b) { return a.y<b.y; } int main(){ int t,n; cin>>t; while(t--){ cin>>n; long long ans=INF; memset(a,0,sizeof(0)); for(int i=0;i<n;i++){ cin>>a[i].x>>a[i].y; long long tmp=a[i].x; a[i].x+=a[i].y; a[i].y-=tmp; } sort(a,a+n,cmp1); long long sum=0; for(int i=0;i<n;i++){ a[i].sum=i*a[i].x-sum; sum+=a[i].x; } sum=0; for(int i=n-1;i>=0;i--){ a[i].sum+=sum-(n-1-i)*a[i].x; sum+=a[i].x; } sort(a,a+n,cmp2); sum=0; for(int i=0;i<n;i++){ a[i].sum+=i*a[i].y-sum; sum+=a[i].y; } sum=0; for(int i=n-1;i>=0;i--){ a[i].sum+=sum-(n-1-i)*a[i].y; sum+=a[i].y; ans=min(ans,a[i].sum); } cout<<ans/2<<endl; } }
相关文章推荐
- SVN 权限配置详细说明
- linux修改文件夹及文件权限的命令
- poj 1167 The Buses
- windows10正式版下载安装并激活附最新下载地址
- GDI绘图1——调试
- String StringBuffer StringBuilder比较
- Android复习笔记(4) - 文件读取相关
- lintcode Binary Search
- 简单堆栈类
- Java垃圾回收机制
- 用instancetype代替id作返回类型有什么好处?
- phpcms V9二次开发之联动菜单筛选 包括box字段的多选 单选 筛选教程
- cloudfs4oss配置
- xampp出现 Access forbidden! 问题解决
- [经验]我的电脑只有IE64位浏览器能上网,其他软件都上不了网
- 程序员的出路之一
- hdu4585 shaolin Treap
- Drawable Resources
- Android复习笔记(3)-android下的junit
- web.xml 配置中classpath: 与classpath*:的区别