题解:CF2120E Lanes of Cars

根据贪心,不难想到每次会把最长队伍末尾的那辆车移动到最短队伍的末尾。但由于 k k k 的存在,会导致一些冗余移动的存在。设需要挪动 C C C 辆车,则怒气值可以表示为 f ( C ) + k C f(C) + kC f(C)+kC,其中 f ( C ) f(C) f(C) 是排队所产生的怒气值, k C kC kC 为变道产生的额外怒气值。仔细分析以后,可以发现这是一个凸函数,因此考虑三分答案。

一开始想要三分需要挪车的最短长度 y y y,但是不能忽略 k k k 的影响,有些队伍的长度虽然 > y > y >y,但挪动不移动会更优。于是三分挪动车辆的数量才是最优的。

具体来说,可以枚举哪些队伍的车辆会减少/增加。若现在考虑会减少的队伍的车辆,给 a i a_i ai 排序后,设当前最长队伍的车辆数为 x x x,次长的为 y y y ( x ≠ y x \neq y x=y),然后长度为 x , y x,y x,y 的队伍的数量分别为 f x , f y f_x,f_y fx,fy。若共需要移动 C C C 辆车,则有两种情况:

  • C ≥ ( x − y ) × f x C \ge (x - y) \times f_x C(xy)×fx,也就是说长度为 x x x 的车可以直接变为 y y y C ← C − ( x − y ) × f x ; f y ← f x + f y ; f x ← 0 C \leftarrow C - (x - y) \times f_x;\ f_y \leftarrow f_x + f_y;\ f_x \leftarrow 0 CC(xy)×fx; fyfx+fy; fx0

  • C < ( x − y ) × f x C < (x - y) \times f_x C<(xy)×fx,此时会产生新的队伍长度,也就是 C ← 0 ; f x − ⌊ C f x ⌋ − 1 ← f x − ⌊ C f x ⌋ − 1 + C m o d f x ; ← f x − ⌊ C f x ⌋ + ( f x − C m o d f x ) C \leftarrow 0;\ f_{x - \lfloor\frac{C}{f_x}\rfloor - 1} \leftarrow f_{x - \lfloor\frac{C}{f_x}\rfloor - 1} + C \bmod f_x;\ \leftarrow f_{x - \lfloor\frac{C}{f_x}\rfloor} + (f_x - C \bmod f_x) C0; fxfxC1fxfxC1+Cmodfx; fxfxC+(fxCmodfx)

可以发现最后队伍长度的种类数不会超过 n + 2 n + 2 n+2,因此这是 O ( n ) O(n) O(n) 的。考虑增加的队伍的车辆同理,用 STL 来写会简单一点。但是由于多了一支 log ⁡ \log log,实测会超时:

ll tot = sum * k,res = sum,number = sum;
set <int> s;map <int,int> bg,sm;
s.insert (-1e9);
for (int i = 1;i <= n;++i) s.insert (a[i]),++bg[a[i]];
while (sum)
{int x = *(--s.end ()),num = bg[x];s.erase (x);int y = *(--s.end ());if (sum >= 1ll * (x - y) * num){sum -= 1ll * (x - y) * num;bg[y] += num;bg[x] = 0;}else {bg[x] = 0;int tmp = sum % num;if (tmp) bg[x - sum / num - 1] += tmp;bg[x - sum / num] += num - tmp;sum = 0;}
}
s.clear ();
for (auto [x,num] : bg)if (num) s.insert (x),sm[x] = num;
s.insert (1e9);
while (res)
{int x = *s.begin (),num = sm[x];s.erase (x);int y = *s.begin ();if (res >= 1ll * (y - x) * num){res -= 1ll * (y - x) * num;sm[y] += num;sm[x] = 0;}else{sm[x] = 0;int tmp = res % num;if (tmp) sm[x + res / num + 1] += tmp;sm[x + res / num] += num - tmp;res = 0;}
}
for (auto [x,num] : sm) tot += 1ll * x * (x + 1) / 2 * num;
return tot;
};

再次思考可以发现 STL 的 log ⁡ \log log 完全是多余的,可以通过数组来替代,但需要小心清空与去重的问题。最后的 AC 代码如下,时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

#include <bits/stdc++.h>
#define init(x) memset (x,0,sizeof (x))
#define ll long long
#define ull unsigned long long
#define INF 2e18
#define pii pair <int,int>
using namespace std;
const int MAX = 2e5 + 5;
const int MOD = 1e9 + 7;
inline int read ();
int a[MAX],b[MAX];
vector <int> bg (1000001,0),sm (1000001,0);
void solve ()
{int n = read (),k = read ();ll ans = INF;for (int i = 1;i <= n;++i) a[i] = read ();sort (a + 1,a + 1 + n);auto check = [&] (ll sum) -> ll{ll tot = sum * k,res = sum;int cnt = 0;vector <int> p;for (int i = 1;i <= n;++i) p.push_back (a[i]);for (int i = 1;i <= n;++i) {if (!bg[a[i]]) b[++cnt] = a[i];++bg[a[i]];}b[0] = -1e9;while (sum > 0){int x = b[cnt--],num = bg[x];int y = b[cnt];if (sum >= 1ll * (x - y) * num){sum -= 1ll * (x - y) * num;bg[y] += num;bg[x] = 0;}else {bg[x] = 0;int tmp = sum % num;bg[x - sum / num] += num - tmp,p.push_back (x - sum / num);if (tmp) bg[x - sum / num - 1] += tmp,p.push_back (x - sum / num - 1);sum = 0;}}cnt = 0;for (auto v : p)if (bg[v]) b[++cnt] = v,sm[v] = bg[v],bg[v] = 0;p.clear ();for (int i = 1;i <= cnt;++i) p.push_back (b[i]);b[++cnt] = 1e9;cnt = 1;while (res > 0){int x = b[cnt++],num = sm[x];int y = b[cnt];if (res >= 1ll * (y - x) * num){res -= 1ll * (y - x) * num;sm[y] += num;sm[x] = 0;}else{sm[x] = 0;int tmp = res % num;if (tmp) sm[x + res / num + 1] += tmp,p.push_back (x + res / num + 1);sm[x + res / num] += num - tmp,p.push_back (x + res / num);res = 0;}}for (auto v : p) tot += 1ll * v * (v + 1) / 2 * sm[v],sm[v] = 0;return tot;};ll l = 0,r = accumulate (a + 1,a + n + 1,0ll);while (l < r){ll midl = l + (r - l) / 3,midr = r - (r - l) / 3;ll v1 = check (midl),v2 = check (midr);ans = min (ans,min (v1,v2));if (v1 <= v2) r = midr - 1;else l = midl + 1;}printf ("%lld\n",ans);
}
int main ()
{int t = read ();while (t--) solve ();return 0;
}
inline int read ()
{int s = 0;int f = 1;char ch = getchar ();while ((ch < '0' || ch > '9') && ch != EOF){if (ch == '-') f = -1;ch = getchar ();}while (ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar ();}return s * f;
}

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

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

相关文章

Excel基础:选择和移动

本文演示Excel中基础的选择和移动操作&#xff0c;并在最后提供了一张思维导图&#xff0c;方便记忆。 文章目录 一、选择1.1 基础选择1.1.1 选择单个单元格1.1.2 选择连续范围 1.2 行列选择1.2.1 选择整行整列1.2.2 选择多行多列 1.3 全选1.3.1 全选所有单元格1.3.2 智能选择…

Java面试宝典:基础四

80. int vs Integer 维度intInteger类型基本数据类型(8种之一)包装类默认值0null应用场景性能敏感场景(计算密集)Web表单、ORM框架(区分null和0)特殊能力无提供工具方法(如parseInt())和常量(如MAX_VALUE)示例:

RabbitMQ + JMeter 深度集成指南:中间件性能优化全流程解析!

在 2025 年的数字化浪潮中&#xff0c;中间件性能直接决定系统的稳定性和用户体验&#xff0c;而 RabbitMQ 作为消息队列的“老大哥”&#xff0c;在分布式系统中扮演着关键角色。然而&#xff0c;高并发场景下&#xff0c;消息堆积、延迟激增等问题可能让系统不堪重负&#xf…

uniapp image引用本地图片不显示问题

1. uniapp image引用本地图片不显示问题 在uniapp 开发过程中采用image引入本地资源图片。 1.1. 相对路径和绝对路径问题 在UniApp中开发微信小程序时&#xff0c;引入图片时&#xff0c;相对路径和绝对路径可能会有一些差异。这差异主要涉及到小程序和UniApp框架的文件结构、…

论文阅读:arxiv 2025 ThinkSwitcher: When to Think Hard, When to Think Fast

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 ThinkSwitcher: When to Think Hard, When to Think Fast https://arxiv.org/pdf/2505.14183#page2.08 https://www.doubao.com/chat/10031179784579842 文章目录 速览一、…

智能体记忆原理-prompt设计

智能体记忆的管理与设计开发分为以下几步&#xff1a; 1.记忆的抽取&#xff1b; 2.记忆的存储&#xff1b; 3.记忆的搜索&#xff1b; 一、记忆抽取一&#xff1a; FACT_RETRIEVAL_PROMPT f"""你是一位个人信息整理助手&#xff0c;专门负责准确存储事实、用…

026 在线文档管理系统技术架构解析:基于 Spring Boot 的企业级文档管理平台

在线文档管理系统技术架构解析&#xff1a;基于Spring Boot的企业级文档管理平台 在企业数字化转型的进程中&#xff0c;高效的文档管理系统已成为提升协作效率的核心基础设施。本文将深入解析基于Spring Boot框架构建的在线文档管理系统&#xff0c;该系统整合公告信息管理、…

AWTK-MVVM的一些使用技巧总结(1)

在项目中用了一段时间的AWTK-MVVM框架&#xff0c;由于AWTK-MVVM本身的文档十分欠缺&#xff0c;自己经过一段时间的研究折腾出了几个技巧&#xff0c;在此记录总结。 用fscript启用传统UI代码 AWTK-MVVM里面重新设计了navigator机制&#xff0c;重定位了navigator_to的调用方…

openwrt使用quilt工具制作补丁

前言&#xff1a;简单聊一下为什么需要制作补丁&#xff0c;因为openwrt的编译是去下载很多组件放到dl目录下面&#xff0c;这些组件都是压缩包。如果我们要修改这些组件里面的源码&#xff0c;就需要对这些组件打pacth&#xff0c;也就是把我们的差异点在编译的时候合入到对应…

强化学习 (1)基本概念

grid-world example 一个由多个格子组成的二维网格 三种格子&#xff1a;accessible可通行的&#xff1b; forbidden禁止通行的&#xff1b; target目标 state状态 state是智能体相对于环境的状态&#xff08;情况&#xff09; 在grid-world example里&#xff0c;state指的…

【Typst】纵向时间轴

概述 6月10日实验了一个纵向时间轴排版效果&#xff0c;当时没有做成单独的模块&#xff0c;也存在一些Bug。 今天(6月29日)在原基础上进行了一些改进&#xff0c;并总结为模块。 目前暂时发布出来&#xff0c;可用&#xff0c;后续可能会进行大改。 使用案例 导入模块使用…

【Visual Studio Code上传文件到服务器】

在 Visual Studio Code (VS Code) 中上传文件到 Linux 系统主要通过 SSH 协议实现&#xff0c;结合图形界面&#xff08;GUI&#xff09;或命令行工具操作。以下是具体说明及进度查看、断点续传的实现方法&#xff1a; ⚙️ 一、VS Code 上传文件到 Linux 的机制 SSH 远程连接 …

手机控车一键启动汽车智能钥匙

手机一键启动车辆的方法 手机一键启动车辆是一种便捷的汽车启动方式&#xff0c;它通过智能手机应用程序实现对车辆的远程控制。以下是详细的步骤&#xff1a; 完成必要的认证与激活步骤。打开手机上的相关移动管家手机控车APP&#xff0c;并与车载蓝牙建立连接。在APP的主界面…

基于深度学习的语音增强技术:时间增强多尺度频域卷积网络模型解析

基于深度学习的语音增强技术&#xff1a;时间增强多尺度频域卷积网络模型解析 近年来&#xff0c;随着语音处理技术的不断发展&#xff0c;语音增强&#xff08;Speech Enhancement&#xff09;逐渐成为研究热点。语音增强的主要目标是通过消除噪声和改善信噪比来提高语音质量…

计算机组成原理-数据表示与运算(三)

### 文字提取结果&#xff1a; #### 题目内容&#xff1a; 34. 【2009 统考真题】浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判断溢出等步骤。设浮点数的阶码和尾数均采用补码表示&#xff0c;且位数分别为 5 和 7&#xff08;均含 2 位符号位&#xff09;。…

Learning Fully Convolutional Networks for Iterative Non-blind Deconvolution论文阅读

Learning Fully Convolutional Networks for Iterative Non-blind Deconvolution 1. 研究目标与实际问题1.1 研究目标1.2 实际意义2. 创新方法与模型设计2.1 核心框架:迭代式梯度域处理2.1.1 模型架构2.2 关键技术实现2.2.1 梯度域去噪网络2.2.2 解卷积模块(核心公式实现)2.…

Vue3——组件传值

父传子 props ——最推荐的方法&#xff08;TOP1级别&#xff09; 父组件文件 <sidebar :text"textname" ></sidebar> //父组件通过 :text 将父组件的数据textname传递给子组件 const textname:Ref<dataFather[]> ref([{name:刘亦菲,age:18 },…

DOP数据开放平台(真实线上项目)

什么是数据开放平台&#xff1f; 数据开放平台是一种通过公开应用程序编程接口&#xff08;API&#xff09;或结构化数据&#xff0c;允许第三方开发者或机构访问、使用和共享数据的平台‌&#xff0c;旨在促进数据流通、打破信息孤岛并激发创新应用。 DOP数据开放平台简单演示…

InfluxDB 3 Core数据库管理指南:从概念到实操的完整流程

本文深入解析InfluxDB 3 Core的数据库管理核心概念&#xff0c;涵盖数据库与历史版本的兼容性差异、关键限制&#xff08;数据库/表/列数量&#xff09;、以及创建/查看/删除数据库的完整命令行操作。通过结构化流程和实用建议&#xff0c;帮助用户高效管理时序数据存储&#x…

JVM(11)——详解CMS垃圾回收器

CMS (Concurrent Mark-Sweep) 垃圾回收器。它是 JDK 1.4 后期引入&#xff0c;并在 JDK 5 - JDK 8 期间广泛使用的一种以低停顿时间 (Low Pause Time) 为主要目标的老年代垃圾回收器。它是 G1 出现之前解决 Full GC 长停顿问题的主要方案。 一、CMS 的设计目标与定位 核心目标…