CF187E Heaven Tour

news/2024/11/18 19:41:30/文章来源:https://www.cnblogs.com/cxqghzj/p/18553482

题意

给定 \(n\) 个点,初始在 \(s\) 点,求走遍所有点的最小移动距离,以及方案,需要向左走恰好 \(l\) 次。

\(n \le 10 ^ 5\)

Sol

难点在于想到枚举终点。

钦定当前若终点在起点右边,那么最优走法就是先向左走到底,然后向右走到底,然后最后再走到终点。

其中中间重复走的段,显然可以发现每一段至多被多走一次,用来多一个 \(l\) 少一个 \(r\),如果一段走了多次,还不如直接重复走旁边的两段。

对于两边本身就走两次的段,尽量全部走 \(l\),这样可以算出来中间需要多走多少次,注意到每次需要的次数是单调不降的,直接对顶堆维护即可。

求方案略显恶心,复杂度:\(O(n \log n)\)

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <queue>
#include <set>
#include <vector>
#define ll long long
using namespace std;
#ifdef ONLINE_JUDGE#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;#endif
int read() {int p = 0, flg = 1;char c = getchar();while (c < '0' || c > '9') {if (c == '-') flg = -1;c = getchar();}while (c >= '0' && c <= '9') {p = p * 10 + c - '0';c = getchar();}return p * flg;
}
void write(ll x) {if (x < 0) {x = -x;putchar('-');}if (x > 9) {write(x / 10);}putchar(x % 10 + '0');
}
bool _stmer;const int N = 1e5 + 5;namespace Hth {priority_queue <int> q1;
priority_queue <int, vector <int>, greater <int> > q2;ll ans;void insert(int x) { q2.push(x); }int resize(int k) {while (q1.size() > k)ans -= q1.top(), q2.push(q1.top()), q1.pop();while (q1.size() < k && q2.size())ans += q2.top(), q1.push(q2.top()), q2.pop();return q1.size() == k;
}void init() {while (q1.size()) q1.pop();while (q2.size()) q2.pop();ans = 0;
}} //Htharray <int, N> s;vector <ll> solve(int n, int m, int k) {Hth::init();ll ans = 0, res = 2e18;for (int i = k + 1; i <= n; i++) {ll _res = 2e18;if (k - 1 + n - i >= m)_res = 2 * s[n] - s[i] + s[k];else if (Hth::resize(m - k - n + i + 1))_res = 2 * s[n] - s[i] + s[k] + 2ll * Hth::ans;/* if (i == 10) *//* cerr << m - k - n + i + 1 << " " << Hth::ans << " " << _res << "@@@@" << endl; */if (_res < res) res = _res, ans = i;if (i - 1 > k) Hth::insert(s[i] - s[i - 1]);}if (!ans) return vector <ll>(1, res);Hth::init();for (int i = k + 2; i < ans; i++)Hth::insert(s[i] - s[i - 1]);Hth::resize(m - k - n + ans + 1);/* cerr << m - k - n + ans + 1 << "@" << endl; */vector <ll> isl; multiset <int> req;isl.push_back(res);while (Hth::q1.size())req.insert(Hth::q1.top()), Hth::q1.pop();int tp0 = 0;for (int i = k - 1; i >= 2; i--)if (m > (k != 1) + (ans != n)) isl.push_back(i), m--, tp0++;if (k != 1) isl.push_back(1), m--;for (int i = 2; i <= k - tp0 - 1; i++)isl.push_back(i);set <int> tp;for (int i = k + 1; i < ans - 1; i++)if (i + 1 != ans && req.find(s[i + 1] - s[i]) != req.end() && m > (ans != n))tp.insert(i), req.erase(req.find(s[i + 1] - s[i])), m--;/* for (auto p : tp) *//* cerr << p << "@" << endl; */for (int i = k + 1; i <= ans - 1; i++) {/* if (i + 1 != ans && m > 1 && req.find(s[i + 1] - s[i]) != req.end()) *//* isl.push_back(i + 1), isl.push_back(i), m--, req.erase(req.find(s[i + 1] - s[i])), i += 2; *//* else *//* isl.push_back(i); */int lst = 0;while (tp.find(i + lst) != tp.end()) lst++;if (!lst) isl.push_back(i);else {for (int j = lst + i; j >= i; j--)isl.push_back(j);i += lst;/* isl.push_back(-1); */}}for (int i = ans + 1; i <= ans + (n - ans - 1) - (m - (ans != n)); i++)isl.push_back(i);if (ans != n) isl.push_back(n);for (int i = n - 1; i >= n - (m - (ans != n)); i--)isl.push_back(i);isl.push_back(ans);return isl;
}bool _edmer;
int main() {cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";int n = read(), m = read(), k = read();for (int i = 1; i <= n; i++) s[i] = read();if (m == 0) {if (k != 1) return puts("-1"), 0;write(s[n] - s[1]), puts("");for (int i = 2; i <= n; i++)write(i), putchar(32);return puts(""), 0;}if (m == n - 1) {if (k != n) return puts("-1"), 0;write(s[n] - s[1]), puts("");for (int i = n - 1; i; i--)write(i), putchar(32);return puts(""), 0;}vector <ll> tp1 = solve(n, m, k);m = n - 1 - m, k = n - k + 1;for (int i = 1; i <= n; i++)s[i] = s[n] - s[i];reverse(s.begin() + 1, s.begin() + 1 + n);/* for (int i = 1; i <= n; i++) *//* cerr << s[i] << " "; *//* cerr << endl; */vector <ll> tp2 = solve(n, m, k);if (tp1.front() < tp2.front()) {write(tp1.front()), puts("");tp1.erase(tp1.begin());for (auto p : tp1)write(p), putchar(32);puts("");}else {write(tp2.front()), puts("");tp2.erase(tp2.begin());for (auto p : tp2)write(n - p + 1), putchar(32);/* cerr << p << " "; */puts("");}/* cerr << tp.front() << endl; *//* for (auto k : tp) *//* cerr << k << " "; *//* cerr << endl; */return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836344.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Nginx Ingress 实现金丝雀发布/灰度发布

使用 Nginx Ingress 实现金丝雀发布/灰度发布 说明: 使用 Nginx Ingress 实现金丝雀发布的集群,需部署 Nginx Ingress 作为 Ingress Controller,并且对外暴露统一的流量入口。详情请参见 在 TKE 上部署 Nginx Ingress。 使用场景 使用 Nginx Ingress 实现金丝雀发布适用场景…

# 20222309 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一…

如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示

本文介绍开源鸿蒙OpenHarmony系统下,开启/关闭SELinux权限的方法,触觉智能Purple Pi OH鸿蒙开发板演示,已适配全新OpenHarmony5.0 Release系统!本文介绍在开源鸿蒙OpenHarmOony系统下,开启/关闭SELinux权限的方法,触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK356…

locust(服务器压测)

一: 注意事项:项目和压力机不能在同一台机器 二: 1.脚本压测 命令行:locust -f get.py --host=http:ip+host 注意事项Wait_time写0,0 不进行等待 1.脚本压测 2.1服务器防火墙需要关闭 2.2需要把打印去掉 2.3 Download Data 下载报告三.非web模式新版中 -u 指的是多少 用户/…

旺仔水饺-冲刺总结

1. 冲刺内容总结与反思 1.1 项目总结 本次冲刺阶段对项目的不足之处进行了相关改进: 针对团队沟通问题: 我们在本次冲刺阶段几乎是每天召开团队会议,包括沟通效率比较高的的站立会议;我们站立会议每次召开十分钟,尽量在这个十分钟之内大家都都把自己当前进行的的功能模块遇…

线程初见与线程管理

Chap1,2 Hello Concurrency与线程管理 参考书目:《C++ Concurrency in action》- By Anthony Willians, Second Edition 读书笔记 Contents定义并发,多线程 使用并发,多线程 简单的C++多线程1.1 什么是并发 1.1.1 计算机并发多核心:真正并行 单核心:时间片切换。1.1.2 并发…

人工智能之机器学习线代基础——线性相关和线性无关

线性相关(Linearly Dependent) 和 线性无关(Linearly Independent) 是线性代数中描述向量组关系的概念,用于判断向量组是否可以通过线性组合生成其他向量,以及它们是否包含冗余信息。

BurpSuite功能介绍

Burp Suite一共包含13个功能模块,它们帮助渗透测试人员更好地了解目标应用的整体状况、当前的工作涉及哪些目标、攻击面等信息。 Burp Suite Target主要包含站点地图、目标域、Target工具域并分析可能存在的漏洞。 Burp Suite Spider主要用于大型的应用系统测试,它能在很短时…

Jluosne的GNU Radio 频道的介绍

Jluosne的GUN Radio的频道 本频道主要发布有关GUN Radio有关的学习路径和学习资料,相关材料涉及到GUN Radio官方网站和优质的博文会进行refence mark。欢迎大家的关注和评论。 本频道的内容发布周期 非节假日为日刊,节假日休刊。不定期休刊,休刊会提前发布声明。 本频道的发…

2024-2025, 四大翻译工具加AI翻译的深度对比

在过去两年中,人工智能技术的迅猛发展对翻译工具产生了深远的影响。本期特意挑选了四款翻译工具以及一个AI翻译工具,对其性能进行评测,看看在AI技术的加持下,它们的质量提升如何。前言 在过去两年中,人工智能技术的迅猛发展对翻译工具产生了深远的影响。 本期特意挑选了四…

vue2-组件化编程

模块:向外提供特定功能的js呈现 组件:用来实现局部(特定)功能效果的代码集合 模块化:当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用 组件化:当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用编写组件-非单文件组件非单文件组件:一个…