[Luogu 4998 信号塔] 题解报告
- 估计没人看的简化版题意:
给定一个数轴,以及数轴上的 \(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
现在从两个方向考虑优化:
- 减少枚举数量。也就是减少 \(x\) 的枚举数量。
- 减少计算过程。也就是降低求 \(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 信号塔] 题解报告的更多相关文章
- Luogu P4204 神奇口袋 题解报告
题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为a[i],每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. ...
- Luogu P4358 密钥破解 题解报告
题目传送门 [题目大意] 给定一个正整数N,可以被分解为两个不同的质数p和q,计算出r=(p-1)*(q-1). 然后给出了一个小于r且与r互质的整数e,已知e*d≡1(mod r),求d. 最后给定 ...
- 【BZOJ2823】[AHOI2012]信号塔(最小圆覆盖)
[BZOJ2823][AHOI2012]信号塔(最小圆覆盖) 题面 BZOJ 洛谷 相同的题: BZOJ1 BZOJ2 洛谷 题解 模板题... #include<iostream> #i ...
- 2015浙江财经大学ACM有奖周赛(一) 题解报告
2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...
- bzoj2823[AHOI2012]信号塔
2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1190 Solved: 545[Submit][Status ...
- cojs 强连通图计数1-2 题解报告
OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...
- cojs 二分图计数问题1-3 题解报告
OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...
- 2018.07.04 BZOJ 2823: AHOI2012信号塔(最小圆覆盖)
2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MB Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握 ...
- poj3020 建信号塔(匈牙利算法 最小覆盖边集)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10518 Accepted: 518 ...
- 题解报告:hdu 1398 Square Coins(母函数或dp)
Problem Description People in Silverland use square coins. Not only they have square shapes but also ...
随机推荐
- Oracle CloudWorld 2023:Safra Catz主题演讲——把客户的成功放在首要位置
Safra Catz在Oracle CloudWorld 2023的开场演讲主题是"把客户的成功放在首要位置".她强调了客户的重要性,并说大家通过合作和技术可以实现几乎一切.她感谢 ...
- vscode没有完全汉化怎么办? vs code部分内容没汉化的解决办法
- Angular2 通过自定义指令限制输入框输入类型
** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/16814577.html 在input控件中,使用type="n ...
- 图形学、02 推导证明 | 任意一点经过透视投影后 z 坐标相对于之前有什么变化
齐次坐标知识点: \(\begin{bmatrix} x \\ y \\ z \\ 1 \\\end{bmatrix} \Rightarrow\begin{bmatrix} nx \\ ny \\ n ...
- 【原型链污染】Python与Js
[原型链污染]Python与Js 一.背景 最近在TSCTF的比赛题中遇到了Python的原型链污染题目,所以借此机会学习一下.说到原型链,最多的还是在Js中,所以就一并学习一下.(因为是菜鸡所以文章 ...
- MMKV源码解读与理解
概述 通过 mmap 技术实现的高性能通用 key-value 组件.同时选用 protobuf 协议,进一步压缩数据存储. 标准 protobuf 不提供增量更新的能力,每次写入都必须全量写入.考虑 ...
- js数据结构--队列
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- HttpWebResponse获取DOM数据注意之ContentEncoding
public string GetKaiJ(string type = "ssq") { /*1.通过WebBrowser控件&HttpWebRequest获得网站信息*/ ...
- 阿里云创建BUCKET脚本
创建BUCKET脚本 安装模块 pip install pymysql pip install aliyun-python-sdk-core pip install aliyun-python-sdk ...
- js 实现文件下载/文件导出。
1. POST方式进行文件导出: // url 下载URL // fileName 下载文件名称 function exportFile(url, fileName) { let xhr = new ...