• 估计没人看的简化版题意:

给定一个数轴,以及数轴上的 \(n\) 个点(这些点可能坐落在同一坐标上),第 \(i\) 个点的坐标为 \(a_i\) 。现在要在数轴上找 \(k\) 个点,第 \(i\) 个点的坐标为 \(x_i\) 。求这 \(k\) 个点到原数轴上 \(n\) 个点距离和的最小值,即 \(min(\sum_{i = 1}^{k} \sum_{j = 1}^{n} |x_i - a_j|)\).

注:\(n,\ a_i \leq 10^6,\ k \leq n\)

  • 题目分析:

首先,最容易想到的就是暴力模拟。循环枚举坐标,对于每个坐标,求出其到 \(n\) 个点的距离和。最后再将距离和升序排列。时间复杂度 $O(an) = $TLE

现在从两个方向考虑优化:

  1. 减少枚举数量。也就是减少 \(x\) 的枚举数量。
  2. 减少计算过程。也就是降低求 \(x_i\) 到 \(a_j\) 距离和的复杂度。

而由于 \(x\) 与其他点的距离没有方便计算的函数表示,所以减少枚举数量是不现实的(可能是因为我太弱了)

那么怎样减少计算过程呢??

设一个点 \(x\) 到所有 \(a\) 的距离和为 \(s\)。

我们可以发现,如果 \(x\) 往前走一个单位长度,那么它与它前面点的距离就都会加一,与后面点的距离都会减一。

设 \(x\) 往前移动一位后, \(x\) 前面有 \(c\) 个点,后面有 \(n - c\) 个点。

那么,距离就会变为:\(s + c - (n - c)\)。

所以,我们在枚举信号站坐标的时候,就可以顺带着将信号站到其他点的距离用 \(O(1)\) 算出来

时间复杂度为 \(O(a)\)

代码大概长这样(由于空间有限,就不在这里放了) Wrong Code

然后就惊喜的发现 Wa 了一个点 ...

发现我代码中的错误是在一天之后了。我忽然发现,信号站是有可能建在负数坐标上的,举个栗子:

数轴上点的坐标为: \(a = [0, 0, 0, 0, 0]\)

我们要选择5个信号站。

那么,最优解应该是 \(x = [0, 1, 2, -1, -2]\).

这样,我们的信号站就选到了负数点上。

这样,我们只需要将信号站枚举起点换成 \(-10^6\) (因为 \(k \leq 10^6\) 嘛)。由于数组下标不能是负数,所以我们在数组上加上一个偏移量 \(delta\),让数组下标变成正数即可。

  • Code
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std; typedef long long LL;
const int N = 1000010, M = N << 1;
LL f[M];
int p[N];
int delta = 1e6;
int n, m;
int Map[N]; int main()
{
scanf("%d%d", &n, &m); LL s = 0;
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &p[i]);
Map[p[i]] ++ ;
s += (p[i] + 1e6);
} sort(p + 1, p + n + 1); int l = 0, r = n;
f[0] = s;
for (int i = -1e6 + 1; i <= 1e6; i ++ )
{
f[i + delta] = f[i - 1 + delta] + l - r;
if (i < 0) continue;
if (Map[i]) l += Map[i], r -= Map[i];
} sort(f, f + 2000000 - 1); LL res = 0;
for (int i = 0; i < m; i ++ )
res += f[i]; printf("%lld\n", res); return 0;
}

[Luogu 4998 信号塔] 题解报告的更多相关文章

  1. Luogu P4204 神奇口袋 题解报告

    题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为a[i],每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. ...

  2. Luogu P4358 密钥破解 题解报告

    题目传送门 [题目大意] 给定一个正整数N,可以被分解为两个不同的质数p和q,计算出r=(p-1)*(q-1). 然后给出了一个小于r且与r互质的整数e,已知e*d≡1(mod r),求d. 最后给定 ...

  3. 【BZOJ2823】[AHOI2012]信号塔(最小圆覆盖)

    [BZOJ2823][AHOI2012]信号塔(最小圆覆盖) 题面 BZOJ 洛谷 相同的题: BZOJ1 BZOJ2 洛谷 题解 模板题... #include<iostream> #i ...

  4. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  5. bzoj2823[AHOI2012]信号塔

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1190  Solved: 545[Submit][Status ...

  6. cojs 强连通图计数1-2 题解报告

    OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...

  7. cojs 二分图计数问题1-3 题解报告

    OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...

  8. 2018.07.04 BZOJ 2823: AHOI2012信号塔(最小圆覆盖)

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MB Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握 ...

  9. poj3020 建信号塔(匈牙利算法 最小覆盖边集)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10518   Accepted: 518 ...

  10. 题解报告:hdu 1398 Square Coins(母函数或dp)

    Problem Description People in Silverland use square coins. Not only they have square shapes but also ...

随机推荐

  1. Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。

    Docker Swarm是Docker官方自带的容器编排工具,Swarm,Compose,Machine合称Docker三剑客.Docker Swarm对于中小型应用来说,还是比较方便,灵活,当然K8 ...

  2. 【遥遥领先】Eolink IDEA 插件:零代码入侵,自动生成接口

    省流版: Eolink 有 IDEA 插件吗? 有,而且遥遥领先!我们在一年半之前就发布了,而且功能更丰富! IDEA 插件市场搜索"Eolink Apikit"即可安装使用. 使 ...

  3. Redis系列之——API的使用

    文章目录 一 通用命令 1.1 通用命令 1.2 数据结构和内部编码 1.3 单线程架构 1.3.1 单线程架构, 1.3.2 单线程为什么这么快 1.3.3 注意 二 字符串类型 2.1 字符串键值 ...

  4. python---简单最大类间方差法(OTSU)算法

    from matplotlib import pyplot as plt # cv2.imread()用于读取图片文件 # imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形 ...

  5. CF1364B

    题目简化和分析: 这题没啥好说的,找其绝对值最大,也就是找到每一个山峰山谷. 这样不仅满足选择的个数最少,并且值最大. 正确性证明: 若 \(a\le b\le c\) \(|a-b|+|b-c|=( ...

  6. 手撕Vue-实现事件相关指令

    经过上一篇文章的学习,实现了界面驱动数据更新,接下来实现一下其它相关的指令,比如事件相关的指令,v-on 这个指令的使用频率还是很高的,所以我们先来实现这个指令. v-on 的作用是什么,是不是可以给 ...

  7. Net 高级调试之二:CLR和Windows加载器及应用程序域介绍

    一.简介 今天是 Net 高级调试的第二篇文章,第一篇文章记录了自己学习 Net 高级调试的第一步,认识一些调试工具,有了工具的倚仗,我们开始仗剑走天涯了,开始Net 高级调试正式的征程了.我先说一下 ...

  8. QT Recursive repaint detected 检测到递归重绘

    1.打印绘图时的线程号,如果与主线程号不一致,则需要使用信号传递数据,在主线程窗体中绘图 如下: qDebug() << "当前线程:" <<QThread ...

  9. 【matplotlib 实战】--雷达图

    雷达图(Radar Chart),也被称为蛛网图或星型图,是一种用于可视化多个变量之间关系的图表形式.雷达图是一种显示多变量数据的图形方法.通常从同一中心点开始等角度间隔地射出三个以上的轴,每个轴代表 ...

  10. MySQL 数据库表格创建、数据插入及获取插入的 ID:Python 教程

    创建表格 要在MySQL中创建表格,请使用"CREATE TABLE"语句. 确保在创建连接时定义了数据库的名称. 示例创建一个名为 "customers" 的 ...