前缀+排序 HDOJ 4311 Meeting point-1
2024-08-30 15:19:33
题意:给一些坐标轴上的点,选一个点,使得其他点到该点曼哈顿距离和最小
分析:这题有很强的技巧性,直接计算每个点的曼哈顿距离和是不可行的。这里用到了前缀的思想,先对点按照x从左到右排序,p[i].sum保存选择i点时曼哈顿距离和是多少,p[i].sum = (i - 1) * p[i].x - sum (p1.x~pi-1.x) + sum (pi+1.x~pn.x) - (n - i) * p[i].x; ,i前面每个点的到i的x轴距离为:p[i].x - p[j].x,i后面每个点到i的x轴距离为:p[j].x - p[i].x,累计求和就是上式,y轴同理,可能配上图好理解:
那么每个点都计算出来了,只要在遍历一遍取最小值就是答案
收获:1. 前缀的使用技巧 2. 还有升级版的?
代码:
/************************************************
* Author :Running_Time
* Created Time :2015-8-24 13:21:56
* File Name :B_2.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const ll INFF = 1ll << 62;
const int MOD = 1e9 + 7;
struct Point {
ll x, y, sum;
}p[N];
int n; bool cmpx(Point a, Point b) {
return a.x < b.x;
} bool cmpy(Point a, Point b) {
return a.y < b.y;
} int main(void) {
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d", &n);
for (int i=1; i<=n; ++i) {
scanf ("%I64d%I64d", &p[i].x, &p[i].y);
}
sort (p+1, p+1+n, cmpx); ll sum = 0;
for (int i=1; i<=n; ++i) {
p[i].sum = (i - 1) * p[i].x - sum;
sum += p[i].x;
}
sum = 0;
for (int i=n; i>=1; --i) {
p[i].sum += sum - (n - i) * p[i].x;
sum += p[i].x;
} sort (p+1, p+1+n, cmpy); sum = 0;
for (int i=1; i<=n; ++i) {
p[i].sum += (i - 1) * p[i].y - sum;
sum += p[i].y;
}
sum = 0;
for (int i=n; i>=1; --i) {
p[i].sum += sum - (n - i) * p[i].y;
sum += p[i].y;
} ll ans = INFF;
for (int i=1; i<=n; ++i) {
ans = min (ans, p[i].sum);
}
printf ("%I64d\n", ans);
} return 0;
}
最新文章
- 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)
- js判断是否安装pdf播放器
- 【WP8.1】富文本
- 最基本的session保存法,类似于默认的files方法
- 转:Bat命令学习
- 关于C# 中的Attribute 特性
- 基于C#的SolidWorks插件开发(1)--SolidWorks API接口介绍
- 多主一从mysql replication同步表的大胆尝试.
- ionic入门之色彩、图标和边距和界面组件:列表
- 【嵌入式linux】(第三步):安装串口终端 (ubuntu安装minicom串口终端)
- 【RL-TCPnet网络教程】第39章	RL-TCPnet之TFTP服务器
- 爬虫 解析库re,Beautifulsoup,
- mac系统如何处理来自身份不明的开发者
- tomcat免安装版做成windows系统服务
- MySQL数据类型2
- 数组去重的4种方法(Which one is the fastest???嘻嘻嘻....)
- js 如何移除一个匿名函数的绑定事件
- 使用vmware提示无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件
- python ---24 正则表达式 re模块
- 标准C库函数