当前位置: 首页 > news >正文

洛谷 P12865

给定长度为 \(n\) 的序列 \(a\)\(q\) 次操作。每次操作为对 \(a\) 进行一次冒泡排序(\(a_i > a_{i + 1}\) 时交换)或者查询 \(a_l \sim a_r\) 之和。

对于一次冒泡排序,显然会把最大值挪到最后面。所以,当 \(a_1 \sim a_i\) 做完冒泡排序后,\(a’_i \leftarrow \max\limits_{j = 1} ^ i a_j\),再和 \(a_{i + 1}\) 进行比较,尝试交换。

因此得到一个结论:一次冒泡排序后 \(a’_1 \sim a_i\) 一定是原来 \(a_1 \sim a_{i + 1}\)最小的 \(i\) 个。

再尝试考虑两次冒泡排序。对于 \(i + 1\) 来说,\(a'_1 \sim a'_i\)\(a_1 \sim a_{i + 1}\) 中小的 \(i\) 个;\(a'_1 \sim a'_{i + 1}\)\(a_{1} \sim a_{i + 2}\) 中小的 \(i + 1\) 个。说明什么?说明 \(a'_{i + 1}\)\(a_1 \sim a_{i + 1}\) 中最大的与 \(a_{i + 2}\) 之间小的那个。所以经过两次冒泡后 \(a''_{1} \sim a''_{i}\)\(a_1 \sim a_{i + 2}\) 中小的 \(i\) 个。

这是我们就可以得(猜)到一个结论:经过 \(c\) 次冒泡排序后,\(a_1 \sim a_{i}\)\(a_{1} \sim a_{i + c}\) 中最小的 \(i\) 个。

换个角度,因为一次冒泡一个元素知道只能向左移一次,所有考虑的范围也就是 \(a_1 \sim a_{i + c}\) 了。

做到这里,这个题就差不多了,\(a_1 \sim a_i\)用主席树搞一下 ,\(a_{l} \sim a_r\) 前缀和减一下即可。

http://www.hskmm.com/?act=detail&tid=33254

相关文章:

  • ubuntu清理内存缓存
  • ubuntu常用技巧
  • 10.17 CSP-S模拟33 改题记录
  • 包装类(基本数据类型对应的引用数据类型)
  • luogu P7915 [CSP-S 2021] 回文
  • USACO 绿-蓝 思维题小记
  • Day16-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\classlei
  • 一个实用的短视频脚本创作指令分享
  • 字典树 Trie 乱讲
  • redis和mysql之间的数据一致性
  • ubuntu允许root登录桌面系统
  • 24. 两两交换链表中的节点
  • AI协科学家:技术革命还是安全噩梦?
  • 一个决定
  • 10月17日
  • npm镜像配置
  • 一些特性
  • ubuntu安装mysql
  • 计算机视觉技术与应用深度解析
  • AGC 板刷记录1
  • 2025.10.17总结
  • 记Windows 11环境Rust下载安装配置流程
  • K8s学习笔记(九) job与cronjob - 教程
  • [HZOI]CSP-S模拟33
  • [PaperReading] VLM2Vec-V2: Advancing Multimodal Embedding for Videos, Images, and Visual Documents
  • ShandongCCPC2024
  • 标悬浮展开多级菜单
  • Nimble:让SwiftObjective-C测试变得更优雅的匹配库 - 指南
  • 2025.10.17总结 - A
  • Ubuntu创建python桌面图标