洛谷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\n", 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;
}
洛谷P3964松鼠聚会的更多相关文章
- 洛谷P3964 [TJOI2013]松鼠聚会 [二分答案,前缀和,切比雪夫距离]
题目传送门 松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示, ...
- 洛谷P3964 [TJOI2013]松鼠聚会(坐标系变换)
题面 传送门 题解 对于两个点\((x_i,y_i)\)和\(x_j,y_j\),我们定义它们之间的曼哈顿距离为 \[|x_i-x_j|+|y_i-y_j|\] 定义它们的切比雪夫距离为 \[\max ...
- 洛谷 P1293 班级聚会
P1293 班级聚会 题目描述 毕业25年以后,我们的主人公开始准备同学聚会.打了无数电话后他终于搞到了所有同学的地址.他们有些人仍在本城市,但大多数人分散在其他的城市.不过,他发现一个巧合,所有地址 ...
- 洛谷 P2069 松鼠吃果子
P2069 松鼠吃果子 题目描述 有N个一种松鼠喜欢吃的果子由下向上串排成一列,并标号1,2,...N.一只松鼠从最下果子开始向上跳,并且第i次跳可以一次跳过i*i*i除以5的余数+1个果子(=i*i ...
- 洛谷 P3258 松鼠的新家 题解
题面 貌似这道题暴力加玄学优化就可以AC? 下面是正解: 1.树链剖分: 我们在u到v之间都放一个糖果,可以将松鼠它家u到v的糖果数都加1.每一次将a[i]到a[i+1] (a数组是访问顺序)的节点加 ...
- 洛谷 [P3258] 松鼠的新家
树上差分 对于一条路径 \(u->v\) 来说,设 \(t=LCA(u,v)\) ,d[]为差分数组 ,则有 d[u]++;d[v]++;d[t]--;d[fa[t]]--; 注意:题目中所给的 ...
- 洛谷P4281 紧急集合 / 聚会
LCA 题目要求找离三个点最近的点,我们先看两个点的情况,自然是找LCA,那么三个点的时候是否与LCA有关呢? 显然,离三个点最近的点一定是在这三个点联通的简单路径上. 可以简单证明一下,假设某个点离 ...
- 洛谷P3258 松鼠的新家
树上差分 这应该是一道很简单的树上差分了..就是问每个点被覆盖了多少次. 要注意我们最后dfs后,要把除第一个节点以外的所有点的-1,因为有些点作为起点和终点覆盖了两次,按照题目意思是不用覆盖两次的. ...
- 洛谷P3258松鼠的新家
题目传送门 恩,很明显的一个树剖题,配合树上差分其实也并不难,不过无奈蒟蒻树剖还没那么熟练,而且树上差分也做的少,所以这题愣是做了一中午......唉,果然我还是太菜了.恩,具体做法在代码中解释吧: ...
随机推荐
- 修改Excel脚本
批量修改Excel TODO: 批量修改Excel 功能: 将图片防止在本地,读取excel数据,拆分数据之后根本地照片名称对比,然后上传服务器,创建新得excel. #!/usr/bin/pytho ...
- windows cmd下列出当前目录下的所有文件
使用的命令是dir 如,列出当前目录下的目录及文件名到1.txt: dir /b >1.txt 只列出某类文件 dir *.txt /b >1.txt
- ASP.NET 一般处理程序 接收文件上传
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain&qu ...
- canvas教程(二) 绘制直线
经过 canvas 教程(一) 简介 我们知道了 canvas 的一些基本情况 而本次是给大家带来直线的绘制 canvas 中,基本图形有两种,一种是直线,还有一种是曲线 但是无论是直线还是曲线,我们 ...
- Jmeter学习笔记(八)——监听器元件之聚合报告
1.聚合报告添加 聚合报告是常用的监听器之一,添加路径: 点击线程组->添加->监听器->聚合报告 2.聚合报告界面及说明 Label:请求的名称,就是我们在进行测试的httpreq ...
- 解决远程连接数据库:Host is not allowed to connect to this MySQL server
远程连接数据时,报以下提示: Host 'web1' is not allowed to connect to this MySQL server 原因是数据库服务不允许远程登录,没有授权导致,解决方 ...
- python爬虫爬取get请求的页面数据代码样例
废话不多说,上代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # 导包 import urllib.request import urllib.pars ...
- vue-cli3.0 脚手架搭建项目的过程详解
1.安装vue-cli 3.0 ? 1 2 3 npm install -g @vue/cli # or yarn global add @vue/cli 安装成功后查看版本:vue -V(大写的V) ...
- git 如何忽略已经加入到版本控制的文件
增加 .gitignore 文件,里面添加需要忽略的文件(file_not_wanted): 执行命令 git rm -r --cached . 注意,最后的点.不要省略. 最后重新将所有文件添加 ...
- Linux硬盘满了,系统速度贼慢,居然是Jenkins.log太大了
用查找命令找出大于1G的文件 find / -size +1G -print 为什么jenkins.log会产生40+G的文件? 以上在Windows上的时候,运行了几个月,也没有发生这种现象? 而在 ...