bzoj 3170: [Tjoi 2013]松鼠聚会 计算几何
来源:互联网 发布:五级三晋制工资算法 编辑:程序博客网 时间:2024/04/27 14:57
题意
给出n个点,求所有点走到其中一个点的最小切比雪夫距离。切比雪夫距离定义为横纵坐标差的较大值。
n<=100000,-1e9<=xi,yi<=1e9
分析
由于切比雪夫距离不好维护,我们考虑是否能将其转化成曼哈顿距离。
若把所有点的坐标由(x,y)变为(x+y,x-y),则原来的曼哈顿距离就等于现在的切比雪夫距离。同理,把所有点的坐标由(x,y)变为((x+y)/2,(x-y)/2),则原来的切比雪夫距离等于现在的曼哈顿距离。
那么只要对横纵坐标分别计算所有点到每个点的总距离就好了。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int N=100005;int n;struct data{LL x,y,dis;}a[N];int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}bool cmp1(data a,data b){ return a.x<b.x;}bool cmp2(data a,data b){ return a.y<b.y;}int main(){ n=read(); for (int i=1;i<=n;i++) { int x=read(),y=read(); a[i].x=x+y;a[i].y=x-y; } sort(a+1,a+n+1,cmp1); LL tmp=0; for (int i=1;i<=n;i++) { if (a[i].x!=a[i-1].x) tmp+=(LL)(a[i].x-a[i-1].x)*(i-1); a[i].dis+=tmp; } tmp=0; for (int i=n;i>=1;i--) { if (a[i].x!=a[i+1].x) tmp+=(LL)(a[i+1].x-a[i].x)*(n-i); a[i].dis+=tmp; } sort(a+1,a+n+1,cmp2); tmp=0; for (int i=1;i<=n;i++) { if (a[i].y!=a[i-1].y) tmp+=(LL)(a[i].y-a[i-1].y)*(i-1); a[i].dis+=tmp; } tmp=0; for (int i=n;i>=1;i--) { if (a[i].y!=a[i+1].y) tmp+=(LL)(a[i+1].y-a[i].y)*(n-i); a[i].dis+=tmp; } LL ans=(LL)1e16; for (int i=1;i<=n;i++) ans=min(ans,a[i].dis); printf("%lld",ans/2); return 0;}
阅读全文
0 0
- BZOJ 3170 Tjoi 2013 松鼠聚会 计算几何
- bzoj 3170: [Tjoi 2013]松鼠聚会 计算几何
- BZOJ 3170: [Tjoi 2013]松鼠聚会
- BZOJ 3170 [Tjoi 2013]松鼠聚会
- bzoj 3170: [Tjoi 2013]松鼠聚会
- bzoj 3170: [Tjoi 2013]松鼠聚会
- 3170: [Tjoi 2013]松鼠聚会
- 3170: [Tjoi 2013]松鼠聚会
- BZOJ 3170([Tjoi 2013]松鼠聚会-Manhattan距离单点最近)
- BZOJ 3170([Tjoi 2013]松鼠聚会-Manhattan距离单点最近)
- BZOJ P3170: [Tjoi 2013]松鼠聚会
- 3170: [Tjoi 2013]松鼠聚会 (中位数)
- [BZOJ3170] [Tjoi 2013]松鼠聚会
- BZOJ3170: [Tjoi 2013]松鼠聚会
- 杂题 [Tjoi 2013]松鼠聚会
- 【bzoj3170】[Tjoi 2013]松鼠聚会
- BZOJ 3170 TJOI 2013 松鼠聚会 切比雪夫距离
- BZOJ 3170: [Tjoi 2013]松鼠聚会(切比雪夫距离)
- Map集合的四种遍历方式
- 4241: 历史研究
- sessionStorage.getItem("token");
- ubuntu中C++编译及调试方法
- jquery
- bzoj 3170: [Tjoi 2013]松鼠聚会 计算几何
- Hudson的总结
- matlab中将十六进制转换为十进制方法
- Ultra-QuickSort POJ 2299 归并排序算法
- blob 字段图片处理
- C++11多线程编程之Lock讲解
- pascals-triangle-ii
- Codeforces828 D. High Load
- 三栏布局——左右固定,中间自适应