BZOJ 3170 松鼠聚会(切比雪夫距离转曼哈顿距离)
题意
有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。
思路
题目中的距离是切比雪夫距离,而切比雪夫距离与曼哈顿距离可以互相转化。
考虑二维笛卡尔坐标系的坐标原点\(O(0,0)\),与它的切比雪夫距离为1的点的集合形成的图形是一个边长为2的正方形,与它的曼哈顿距离为1的点的集合形成的图形是一个边长为1的正方形,如果把这个边长为2的正方形旋转45度再缩小2倍,两个图形即可重合。
于是对应与点之间的关系,\((x,y)\)对应与\((\frac{x+y}{2},\frac{x-y}{2})\)。为了避免浮点数,我们把点的坐标再乘2。这样,切比雪夫距离就变成了曼哈顿距离了。
现在考虑枚举要汇合的那个点,因为曼哈顿距离为\(\left|x1-x2\right|+\left|y1-y2\right|\)。所以可以对x,y坐标单独考虑。
预处理出x坐标的前缀和和后缀和,这样\(\sum(x-x_i)=\sum x-\sum x_i\)
y坐标同理。
因为坐标范围比较大,需要对坐标进行离散化
时间复杂度\(O(nlogn)\)。
代码
# include<bits/stdc++.h>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-8
# define MOD 100000007
# define INF 1e16
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(register int i=a; i<=n; ++i)
# define FDR(i,a,n) for(register int i=a; i>=n; --i)
# define bug puts("H");
# define lch p<<1,l,mid
# define rch p<<1|1,mid+1,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
inline char nc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int Scan(){
char ch=nc();int sum=0, f=1;
if (ch=='-') f=-1, ch=nc();
while(!(ch>='0'&&ch<='9'))ch=nc();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
return sum*f;
}
const int N=100005;
//Code begin....
struct Node{LL x, y;}node[N];
vector<LL>v1, v2;
LL Xsum1[N], Xsum2[N], Ysum1[N], Ysum2[N];
int Cx1[N], Cx2[N], Cy1[N], Cy2[N];
int main ()
{
int n;
LL x, y;
scanf("%d",&n);
FOR(i,1,n) {
scanf("%lld%lld",&x,&y);
node[i].x=x+y; node[i].y=x-y;
v1.pb(node[i].x); v2.pb(node[i].y);
}
sort(v1.begin(),v1.end()); sort(v2.begin(),v2.end());
int pos1=0, pos2=0;
FOR(i,0,n-1) {
if (i==0||v1[i]!=v1[i-1]) Xsum1[++pos1]=Xsum1[pos1-1]+v1[i], Cx1[pos1]=Cx1[pos1-1]+1;
else Xsum1[pos1]+=v1[i], ++Cx1[pos1];
if (i==0||v2[i]!=v2[i-1]) Ysum1[++pos2]=Ysum1[pos2-1]+v2[i], Cy1[pos2]=Cy1[pos2-1]+1;
else Ysum1[pos2]+=v2[i], ++Cy1[pos2];
}
FDR(i,n-1,0) {
if (i==n-1||v1[i]==v1[i+1]) Xsum2[pos1]+=v1[i], ++Cx2[pos1];
else Xsum2[--pos1]=Xsum2[pos1+1]+v1[i], Cx2[pos1]=Cx2[pos1+1]+1;
if (i==n-1||v2[i]==v2[i+1]) Ysum2[pos2]+=v2[i], ++Cy2[pos2];
else Ysum2[--pos2]=Ysum2[pos2+1]+v2[i], Cy2[pos2]=Cy2[pos2+1]+1;
}
int siz1=unique(v1.begin(),v1.end())-v1.begin();
int siz2=unique(v2.begin(),v2.end())-v2.begin();
LL ans=1e16, tmp;
FOR(i,1,n) {
int idx=lower_bound(v1.begin(),v1.begin()+siz1,node[i].x)-v1.begin()+1;
int idy=lower_bound(v2.begin(),v2.begin()+siz2,node[i].y)-v2.begin()+1;
tmp=(node[i].x*Cx1[idx]-Xsum1[idx])+(Xsum2[idx+1]-node[i].x*Cx2[idx+1])+(node[i].y*Cy1[idy]-Ysum1[idy])+(Ysum2[idy+1]-node[i].y*Cy2[idy+1]);
ans=min(ans,tmp);
}
printf("%lld\n",ans/2);
return 0;
}
BZOJ 3170 松鼠聚会(切比雪夫距离转曼哈顿距离)的更多相关文章
- [BZOJ 3170] 松鼠聚会
Link: BZOJ 3170 传送门 Solution: $Knowledge Point:$ 切比雪夫距离$DIST(a,b)=max\{ |X'_a-X'_b|,|Y'_a-Y'_b|\}$ 曼 ...
- BZOJ 3170 松鼠聚会(XY坐标)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3170 题意:给出二维平面上n个点 (xi,yi).求一点t(1<=t<=n) ...
- BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离
2735: 世博会 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 124 Solved: 51[Submit][Status][Discuss] D ...
- BZOJ.3170.[TJOI2013]松鼠聚会(切比雪夫距离转曼哈顿距离)
题目链接 将原坐标系每个点的坐标\((x,y)\)变为\((x+y,x-y)\),则原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离. 反过来,将原坐标系每个点的坐标\((x,y)\)变为\((\f ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ3170: [Tjoi2013]松鼠聚会(切比雪夫距离转曼哈顿距离)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1524 Solved: 803[Submit][Status][Discuss] Descripti ...
- BZOJ3170 [Tjoi2013]松鼠聚会 切比雪夫距离 - 曼哈顿距离 - 前缀和
BZOJ3170 题意: 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最 ...
- Bzoj3170: [Tjoi2013]松鼠聚会 (切比雪夫距离)
题目链接 显然,题目要求我们求切比雪夫距离,不会的可以去看一下attack的博客. 考虑枚举所有的点 转换为曼哈顿距离后. 那么对于这个点的路程和是. \[\sum_{i=1}^n | x_i - x ...
- HDU 4312 Meeting point-2(切比雪夫距离转曼哈顿距离)
http://acm.hdu.edu.cn/showproblem.php?pid=4312 题意:在上一题的基础上,由四个方向改为了八个方向. 思路: 引用自http://blog.csdn.net ...
随机推荐
- js获取当前日期,并计算几天后日期
获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS” function getNowFormatDate() { var date = new Date(); var seperator ...
- P2157 [SDOI2009]学校食堂Dining
题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...
- jqgrid 批量启动所有行为可编辑状态
有时,为操作方便,需要将jqgrid表格设置为一直处于编辑状态,用户只需要在对应的编辑区填写自己信息,不再频繁的去触发行编辑和保存. 参考代码如下: //$gridCase为传入jqgrid对象 fu ...
- docker 端口映射错误解决方法
今天搞了半天shipyard,在网页上打开时无法显示容器和镜像,最后发现是docker端口映射错误,由于防火墙未关闭: 4月 12 18:51:29 localhost firewalld[757]: ...
- kettle学习笔记(十)——数据检验、统计、分区与JS脚本
一.概述 数据剖析和数据检验: 用于数据的检查.清洗 . 统计步骤: 提供数据采样和统计的功能 分区: 根据数据里某个字段的值,拆分成多个数据块.输出到不同的库表和文件中. 脚本: Javascrip ...
- 【第三课】Centos 7.x系统安装和网络配置以及远程密钥登录
目录 一.安装CentOS 7.3 二.配置网络 1.使用dhclient命令自动获取ip地址 2.使用ip addr或ifconfig命令查看网卡信息 3.使用route命令查看路由信息 4.通过修 ...
- sql优化详细介绍学习笔记
因为最近在面试,发现sql优化这个方面问的特别特别的多.之前都是零零星星,不够全面的了解一点,刚刚在网上查了一下,从 http://blog.csdn.net/zhushuai1221/article ...
- 设计模式 笔记 迭代器模式 Iterator
//---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...
- 软件测试为何我会首选Python
对于软件测试选择什么样的语言去学习,不同的人有不同的回答,为什么我会首选Python呢?这就要从Python的特点与适应领域说了. 一.Python的特点:优雅.明确.简单. 二.Python适合的领 ...
- Java设置PPT的扇形图,与内嵌Excel联动
/** * 设置饼图的主方法 * @param slide 图表 * @param index 图标位置 * @param data 需要设置的数据 * @param titles 关联Excel的标 ...