博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )
阅读量:5305 次
发布时间:2019-06-14

本文共 1961 字,大约阅读时间需要 6 分钟。

题目的距离为max(|x1-x2|, |y1-y2|) (切比雪夫距离). 切比雪夫距离(x, y)->曼哈顿距离((x+y)/2, (x-y)/2) (曼哈顿(x, y)->切比雪夫(x+y, x-y)). 转成Manhattan distance后排序前缀和维护即可.

--------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
#define X(o) x[rx[o]]
#define Y(o) y[ry[o]]
 
typedef long long ll;
 
const int maxn = 100009;
 
ll smx[maxn], smy[maxn], ans;
int N, x[maxn], y[maxn], rx[maxn], ry[maxn];
 
bool cmpX(const int &l, const int &r) {
return x[l] < x[r];
}
 
bool cmpY(const int &l, const int &r) {
return y[l] < y[r];
}
 
int BS(int c[], int r[], int v) {
int L = 0, R = N - 1;
while(L <= R) {
int m = (L + R) >> 1;
if(c[r[m]] == v)
return m;
c[r[m]] < v ? L = m + 1 : R = m - 1;
}
return -1;
}
 
int main() {
scanf("%d", &N);
for(int i = 0; i < N; i++) {
rx[i] = ry[i] = i;
int _x, _y;
scanf("%d%d", &_x, &_y);
x[i] = _x + _y;
y[i] = _x - _y;
}
sort(rx, rx + N, cmpX);
sort(ry, ry + N, cmpY);
smx[0] = X(0);
smy[0] = Y(0);
for(int i = 1; i < N; i++) {
smx[i] = smx[i - 1] + X(i);
smy[i] = smy[i - 1] + Y(i);
}
ans = 1LL << 60;
for(int i = 0; i < N; i++) {
int px = BS(x, rx, x[i]), py = BS(y, ry, y[i]);
ll t = 0;
if(!px) {
t += smx[N - 1] - ll(N) * x[i];
} else {
t += ll(x[i]) * (px * 2 + 2 - N) - 2LL * smx[px] + smx[N - 1];
}
if(!py) {
t += smy[N - 1] - ll(N) * y[i];
} else {
t += ll(y[i]) * (py * 2 + 2 - N) - 2LL * smy[py] + smy[N - 1];
}
ans = min(t, ans);
}
printf("%lld\n", ans >> 1);
return 0;
}

------------------------------------------------------------------------- 

3170: [Tjoi 2013]松鼠聚会

Time Limit: 10 Sec  
Memory Limit: 128 MB
Submit: 874  
Solved: 421
[ ][ ][ ]

Description

有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。

Input

第一行给出数字N,表示有多少只小松鼠。0<=N<=10^5

下面N行,每行给出x,y表示其家的坐标。
-10^9<=x,y<=10^9

Output

表示为了聚会走的路程和最小为多少。

Sample Input

6
-4 -1
-1 -2
2 -4
0 2
0 3
5 -2

Sample Output

20

HINT

Source

 

转载于:https://www.cnblogs.com/JSZX11556/p/5111006.html

你可能感兴趣的文章
Redis发布订阅和应用场景
查看>>
微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)...
查看>>
thinkphp5的控制器调用自身模块和调用其他模块的方法
查看>>
钻牛角尖の根据时间计算周次
查看>>
bzoj 1029: [JSOI2007]建筑抢修
查看>>
【英语】IT English (随时更新...)
查看>>
php采集
查看>>
8.25 ccpc 比赛总结
查看>>
一台java服务器可以跑多少个线程?
查看>>
Java开发体系
查看>>
LeetCode22 Generate Parentheses
查看>>
面试题----合并两个有序数组
查看>>
VeloView源码编译错误记录——VS manifest
查看>>
161.101 - 2018 Summer Semester: Assignment
查看>>
UML - Basic Notations
查看>>
Decorator Pattern
查看>>
栈———链表实现
查看>>
一个新的开始,fightting!
查看>>
idc交叉引用
查看>>
函数的重载
查看>>