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

给定一个数轴,以及数轴上的 \(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. Teamcener AWC Solr链接被拒

    1.检查安装Solr安装情况 2.在tem上勾选添加 安装完成后,总共有2个文件夹需要注意,一个 solr-版本 的文件夹,一个 TcFTSindexer 的文件夹 如果是solr安装的是服务,则不需 ...

  2. Stable Diffusion

     Stable Diffusion  ...using diffusers Stable Diffusion is a text-to-image latent diffusion model cre ...

  3. csps 线性dp

    合唱队形 正反分别求一遍最长上升子序列,然后枚举中间的最高点,计算出来队列里面的最多人,然后就可以知道需要出列的最少人. 过河 tips:两个互质的数字 p,q,他们所不能拼出来的最小的数字是 \(( ...

  4. 一个简单的C4.5算法,采用Python语言

    Test1.py 主要是用来运行的 代码如下: # -*- coding: utf-8 -*- from math import log import operator import treePlot ...

  5. P8684 [蓝桥杯 2019 省 B] 灵能传输 题解

    P8684 [蓝桥杯 2019 省 B] 灵能传输 题解 Part 1 提示 题目传送门 欢迎大家指出错误并私信这个蒟蒻 欢迎大家在下方评论区写出自己的疑问(记得 @ 这个蒟蒻) Part 2 更新日 ...

  6. c#桥接模式详解

    基础介绍:   将抽象部分与它的实现部分分离,使它们都可以独立地变化.适用于不希望在抽象和实现部分之间有固定的绑定关系的情况,或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况.    ...

  7. 🔥🔥你以为你了解TCP协议?这些你可能不知道的细节才是关键!

    引言 在之前的内容中,我们已经详细讲解了TCP面试中最常见的问题,如三次握手和四次挥手等.而今天,我们将继续深入探讨TCP协议的其他方面,比如序列号和TCP Fast Open(TFO)等重要细节问题 ...

  8. .NET的各种对象在内存中如何布局[博文汇总]

    在过去一段时间里,我陆陆续续写一些关于.NET对象类型布局的文章,其中包括值类型和引用类型的内存布局.字符串对象和数组的内存布局等,这里作一个简单的汇总. [1] 如何计算一个实例占用多少内存? 我们 ...

  9. 操作PDF的方法

    PDF的内容提取.转换见上篇 PDF操作: 旋转 删除 合并 拆分 转成图片 导出内嵌资源图片 两页合并成一页 添加.去除密码 添加水印 PDF旋转某一页 var document = pdfView ...

  10. 2023-11-11:用go语言,字符串哈希+二分的例题。 给定长为 n 的源串 s,以及长度为 m 的模式串 p, 要求查找源串中有多少子串与模式串匹配, s‘ 与 s 匹配,当且仅当 s‘ 与 s

    2023-11-11:用go语言,字符串哈希+二分的例题. 给定长为 n 的源串 s,以及长度为 m 的模式串 p, 要求查找源串中有多少子串与模式串匹配, s' 与 s 匹配,当且仅当 s' 与 s ...