CF1637H Minimize Inversions Number 题解

news/2025/3/28 14:49:33/文章来源:https://www.cnblogs.com/Scarab/p/18791607

Description

给定一个 \(1\sim n\) 的排列 \(p\)。 你可以进行下列操作正好一次:

  • 选定 \(p\) 的一个长度为 \(k\) 的子序列,并将其按照相同的顺序移动到 \(p\) 的最前面。

对于 \(k=0,1,\ldots,n\),分别求出 \(p\) 在操作后的最小逆序对数。

\(1\leq n\leq 5\times 10^5\)

Solution

考虑已经选定了 \(q_1,q_2,\ldots,q_k\) 表示操作的数,怎么表示逆序对的减少量

首先如果 \(k=1\),则减少量为 \(\displaystyle\sum_{j=1}^{i-1}{[p_j>p_i]}-\sum_{j=1}^{i-1}{[p_j<p_i]}\),设其为 \(d_i\)

则对于 \(k>1\) 的情况可以得到如下式子:

\[\begin{aligned} 减少量=&\sum_{i=1}^{k}\left(\sum_{j=1}^{q_i-1}{[p_j>p_{q_i}]}-\sum_{j=1}^{q_i-1}{[p_j<p_{q_i}]}-\sum_{j=1}^{i-1}{[p_{q_j}>p_{q_i}]}+\sum_{j=1}^{i-1}{[p_{q_j}<p_{q_i}]}\right)\\ =&\binom{k}{2}+\sum_{i=1}^{k}d_{q_i}-2\sum_{i=1}^{k}\sum_{j=i+1}^{k}{[p_{q_i}>p_{q_j}]} \end{aligned} \]

所以现在只需要最大化 \(\displaystyle\sum_{i=1}^{k}d_{q_i}-2\sum_{i=1}^{k}\sum_{j=i+1}^{k}{[p_{q_i}>p_{q_j}]}\) 了。

经过手玩会有一种感觉是如果存在 \(i<j\)\(p_i>p_j\) 的话 \(j\)\([1,i-1]\)\([j+1,n]\) 的贡献都比 \(i\) 要优,而 \([i+1,j-1]\) 这部分二者是差不多的,所以可以猜测如果存在 \(j\) 满足 \(i<j,p_i>p_j\)\(i\) 选了 \(j\) 没选就一定不优。

证明就考虑每次找到这样的 \((i,j)\)\(j-i\) 最小的一对,可以发现 \([i+1,j-1]\) 中不能有取值在 \([p_j+1,p_i-1]\) 内的,否则不管选不选都能和 \(i\) 或者 \(j\) 构成更小的对。同样的,取值在 \([p_i+1,n]\) 都不能选,\([1,p_j-1]\) 都选了。

\([i+1,j-1]\) 取值在 \([1,p_j-1]\) 的有 \(cnt\) 个,那么式子里第二部分的增量至少为 \(-2\cdot(-cnt)=2\cdot cnt\),同时 \(d_j\)\(d_i\) 少算了至多 \([i+1,j-1]\) 之间的 \(cnt\) 个数,所以将 \(i\) 换成 \(j\) 的变化量至少为 \(2\cdot cnt-cnt=cnt\geq 0\),这说明我们每次选择这样的 \((i,j)\) 调整一定不劣。

最后一定能调整成猜测的情况。

那么此时选的数 \(i\) 的贡献即为 \(\displaystyle c_i=d_i-2\sum_{j=i+1}^{n}{[p_i>p_j]}\)

预处理出这个数组然后每次选择最大的 \(k\) 个选即可。

时间复杂度:\(O(n\log n)\)

Code

#include <bits/stdc++.h>// #define int int64_tusing i64 = int64_t;const int kMaxN = 5e5 + 5;int n;
int a[kMaxN], b[kMaxN];struct BIT {int c[kMaxN];void clear() { std::fill_n(c + 1, n, 0); }void upd(int x, int v) {for (; x <= n; x += x & -x) c[x] += v;}int qry(int x) {int ret = 0;for (; x; x -= x & -x) ret += c[x];return ret;}
} bit;void dickdreamer() {std::cin >> n;for (int i = 1; i <= n; ++i) std::cin >> a[i];i64 ans = 0;bit.clear();for (int i = 1; i <= n; ++i) {int cnt = i - 1 - bit.qry(a[i]);ans += cnt, b[i] = cnt - (i - 1 - cnt);bit.upd(a[i], 1);}bit.clear();for (int i = n; i; --i) {b[i] -= 2 * bit.qry(a[i]);bit.upd(a[i], 1);}std::sort(b + 1, b + 1 + n, std::greater<>());std::cout << ans << ' ';for (int i = 1; i <= n; ++i) {ans -= b[i];std::cout << ans - 1ll * i * (i - 1) / 2 << ' ';}std::cout << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

Vibe Coding彻底火了,到底什么是氛围编程?它如何改变未来的软件开发?

在过去十年间,低代码/无代码平台和 AI 代码助手持续冲击着软件开发行业。如今,一种被称为 Vibe Coding 的新兴实践突然走红,甚至颠覆了人们对"程序员到底在做什么"的认知。本篇文章将从定义到实践策略、从优势到局限性,全方位探讨 Vibe Coding 给软件开发带来的重…

知识蒸馏实战

蒸馏实战小实验 本实验相关代码已开源至github 失败经历 爱爱医数据蒸馏Qwen2.5-7B 1.用爬虫在爱爱医网站爬取1k条数据。(刚学一点爬虫,不会越过验证码,还是自己一次一次验证😅) 2.数据格式预处理,例如: {"instruction": "你需要基于我提供的患者病历,…

VLM-R1环境搭建推理测试

引子 前文也写了DeepSeek R1模型的安装测试,感兴趣的童鞋移步(https://blog.csdn.net/zzq1989_/article/details/145400876?spm=1001.2014.3001.5502)。那么在多模态方面R1方法(GRPO,Group Relative Policy Optimization)能不能用呢?毫无疑问,已经有不少人在尝试了。今…

振弦采集读数仪 智能型 支持振弦、温度、电压、电流测量,无线传输 自动化操作 适用地质灾害与土木工程监测

振弦采集读数仪 智能型 支持振弦、温度、电压、电流测量,无线传输 自动化操作 适用地质灾害与土木工程监测VH03 型多功能读数仪是一款专为多类型传感器设计的手持式读数设备,主要用于单弦式振弦传感器的测量,同时支持电压、电流传感器的辅助测量。设备采用高性能 32 位 ARM …

GoWebDAV,随时随地访问windows电脑上的文件

GoWebDAV使用 WebDAV 分享本地文件,轻量、易于使用English | 简体中文特性基于 Golang 实现,性能高。最终编译为单二进制文件,不需要 Apache 等环境,依赖少。支持浏览器访问。可以在同个端口下启用多个 WebDAV 服务,各自有不同的挂载目录、用户名密码。良好的 Docker 支持…

WPF MVVM入门系列教程(命令)

WPF中的命令模型 在WPF中,我们可以使用事件来响应鼠标和键盘动作。但使用事件会具备一定的局限性,例如:我想通过键盘快捷键触发事件、或者在某个时刻禁用事件。如果使用代码去编写这些控制逻辑,会变得非常枯燥。因此WPF提供了命令模型。 命令具有多个用途。 第一个用途是分…

【读文总结】transformers circuits 随笔

【读文总结】transformers circuits 随笔内容有点太多,先截图一份 contents对 transformers 结构的重刻划 一种常见的 decoder only 的 transformer 结构如下。但是我们可以把这个 residual stream 的线抻直,将这个过程视为 transformer layer 对 residual stream 中所包含的…

vue+leaflet示例:结合geoserver实现地图空间查询(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

tinygo window安装和使用

支持的型号https://tinygo.org/docs/reference/microcontrollers/ 下载win版本https://github.com/tinygo-org/tinygo/releases 新建环境变量D:\Program_Files\tinygo\bin 验证tinygo version 在 VSCode 中创建一个新的文件,命名为 hello.gopackage main import "fmt&q…

基于ARM微处理器的无线串口集线器的总体设计

1 引言 随着21世纪科学技术的不断进步,无线与移动通信相应得到了迅猛的发展。方便快捷的无线接入和无线 互连等新概念和新产品,已逐渐融入人们的工作领域和日常生活中。由于如今对无线频率的大量使用,使无线频率资源日渐匮乏,短距离宽带无线通信技术受到世界许多国家工业界…

Pycharm中配置基于深度学习模型Yolov5的入门车辆识别Python项目

基于Yolov5的入门车辆识别 环境部署 ANACONDA环境 Anaconda官网下载:https://www.anaconda.com/download/ 进入会显示需要注册,直接跳过即可选择对应的系统版本下载安装注意选择安装位置(建议不要安装在C盘)没什么其他特别选项,直接安装即可 安装完成后使用win+r输入cmd打…

在PyCharm中提升编程效率:通义灵码(DeepSeek)助手全攻略(新版)

最近小栈在PyCharm中使用了阿里的 通义灵码 插件还不错,本次就再分享一个好用的AI代码助手,让编码过程更加方便!作者:ISEE小栈 转载来源:「ISEE小栈」微信公众号 最近小栈在PyCharm中使用了阿里的 通义灵码 插件还不错,本次就再分享一个好用的AI代码助手,让编码过程更加…