【题解】雪人三元组统计问题(循环移位 + 条件拆分优化)

【题解】雪人三元组统计问题(循环移位 + 条件拆分优化)

题目大意

给定三个长度为 n 的循环数组 a、b、c(循环数组指元素可循环访问,如 a[n] 等价于 a[0]),统计合法三元组 (i, j, k) 的数量,满足:对所有 t ∈ [0, n-1],均有 a[(i + t) % n] < b[(j + t) % n] < c[(k + t) % n]。其中 i, j, k 为数组的起始下标(范围 0 ≤ i,j,k < n),多组测试用例输入。

解题思路

1. 暴力解法(瓶颈分析)

暴力思路:枚举所有可能的三元组 (i, j, k)(共 n³ 种),对每个三元组遍历 n 个位置验证 a < b < c 的条件。复杂度分析:时间复杂度为 O(t * n⁴)(t 为测试用例数),当 n 达到 5000 时,n⁴ 是天文数字(约 6.25×10¹⁷),完全无法通过时间限制。

2. 第一次优化:循环移位等价性

  1. 核心观察
    三元组 (i, j, k) 与 (i - (j-1) mod n, 1, k - (j-1) mod n) 是等价的:
    循环数组的特性决定了,将 j 固定为 1 时,只需将 i 和 k 同步移位(模 n),得到的雪人序列仅循环顺序改变,a < b < c 的条件是否满足完全不变。
    因此,所有 j ≠ 1 的情况均可映射到 j = 1 的情况,只需计算 j = 1 时的合法 (i, k) 对数,最终结果乘以 n(覆盖 j 的 n 种选择)。
  2. 复杂度优化
    枚举量从 n³ 降至 n²,验证每个 (i, k) 仍需 n 次,时间复杂度优化为 O(t * n³),但 n=5000 时 n³=1.25×10¹¹,仍超时。

3. 第二次优化:条件独立性拆分

  1. 核心观察
    i 和 k 的合法性是相互独立的:
    合法 i 的条件:仅与 a 和 b 相关,即对所有 t,a[(i + t) % n] < b[t](j=1 时 b[(j + t) % n] = b[t]);
    合法 k 的条件:仅与 b 和 c 相关,即对所有 t,c[(k + t) % n] > b[t];
  2. 优化逻辑
    单独统计 j=1 时合法 i 的数量(记为 cnt_i);
    单独统计 j=1 时合法 k 的数量(记为 cnt_k);
    最终答案 = cnt_i * cnt_k * n(*n 对应 j 的所有可能)。
  3. 复杂度优化
    时间复杂度降至 O(t * n²),n=5000 时 n²=25×10⁶,完全满足时间限制。

代码实现

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;void solve() {int n;cin >> n;// 初始化三个循环数组,长度为nvector<int> a(n), b(n), c(n);for (auto &x : a) cin >> x;for (auto &x : b) cin >> x;for (auto &x : c) cin >> x;// cnt_i:j=1时合法i的数量;cnt_k:j=1时合法k的数量LL cnt_i = 0, cnt_k = 0;// 统计合法的i:所有t满足a[(i+t)%n] < b[t]for (int i = 0; i < n; i++) {bool valid = true;for (int step = 0; step < n; step++) {// 循环访问a的第(i+step)个元素(模n实现循环)if (a[(i + step) % n] >= b[step]) {valid = false;break; // 提前退出,减少无效计算}}if (valid) cnt_i++;}// 统计合法的k:所有t满足c[(k+t)%n] > b[t]for (int k = 0; k < n; k++) {bool valid = true;for (int step = 0; step < n; step++) {if (c[(k + step) % n] <= b[step]) {valid = false;break;}}if (valid) cnt_k++;}// 最终答案:合法(i,k)对数 * n(覆盖j的所有选择)cout << cnt_i * cnt_k * n << "\n";
}int main() {// 关闭cin/cout同步,提升输入输出效率(处理大数据量必备)ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) solve();return 0;
}

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

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

相关文章

Mapbox中如何对已经加载的线段进行编辑?

在 Mapbox 中编辑已加载的线段&#xff08;LineString&#xff09;通常需要结合 Mapbox GL JS 和其相关插件来实现。以下是几种常见的编辑方法&#xff1a; 一、使用 Mapbox GL Draw 插件&#xff08;最常用&#xff09; 这是 Mapbox 官方推荐的绘图/编辑工具&#xff0c;支持…

吐血推荐!专科生必备8款AI论文工具测评

吐血推荐&#xff01;专科生必备8款AI论文工具测评 2026年专科生论文写作工具测评&#xff1a;为何值得一看&#xff1f; 随着AI技术的不断进步&#xff0c;越来越多的学术工具开始进入高校师生的视野&#xff0c;尤其是对于专科生而言&#xff0c;论文写作不仅是学业的重要环…

深度测评9个一键生成论文工具,本科生论文写作必备!

深度测评9个一键生成论文工具&#xff0c;本科生论文写作必备&#xff01; AI 工具助力论文写作&#xff0c;高效与精准并存 随着人工智能技术的不断进步&#xff0c;越来越多的 AI 工具被应用于学术写作中&#xff0c;尤其是在本科生论文写作过程中&#xff0c;这些工具不仅…

详细介绍:SVN 入门与实战:从零开始掌握企业级版本控制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ppo可以不需要提取特征,直接训练ac吗。ppo不知道自己现在在第几步吗

ppo可以不需要提取特征&#xff0c;直接训练ac吗Qwen3-MaxPPO&#xff08;Proximal Policy Optimization&#xff09;是一种策略梯度方法&#xff0c;属于Actor-Critic&#xff08;AC&#xff09;架构的一种实现。关于你的问题&#xff1a;“PPO可以不需要提取特征&#xff0c;…

2026年 验证检测服务推荐榜单:臭氧浓度/无菌隔离器/纯蒸汽/GMP/灭菌柜/纯化水/生物安全柜/洁净工作台/高效过滤器检漏,专业精准的合规保障之选

2026年验证检测服务推荐榜单:臭氧浓度/无菌隔离器/纯蒸汽/GMP/灭菌柜/纯化水/生物安全柜/洁净工作台/高效过滤器检漏,专业精准的合规保障之选 在制药、生物科技、医疗器械及高端精密制造等行业,生产环境的洁净度、工…

2026年1月青瓦厂家推荐排行榜:古建筑青瓦/青砖青瓦/小青瓦/仿古青瓦/古建青瓦,甄选匠心工艺与古韵质感优质供应商

2026年1月青瓦厂家推荐排行榜:古建筑青瓦/青砖青瓦/小青瓦/仿古青瓦/古建青瓦,甄选匠心工艺与古韵质感优质供应商 在当代建筑文化复兴与历史街区保护的双重驱动下,古建筑材料市场,尤其是青瓦、古建筑青瓦、青砖青瓦…

基于深度学习的太阳能电池板检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)

本文介绍了一套基于YOLO系列算法的太阳能电池板缺陷检测系统。该系统支持多模态输入(图片/视频/实时摄像头),具备用户管理、多模型切换、检测结果可视化与保存等功能。技术栈采用Python3.10+PyQt5+SQLite,核心对比…

4.2.多线程JUC-并发和并行

一.并发&#xff1a;1.概念&#xff1a;2.解析&#xff1a;"并发"重点强调"交替"&#xff0c;就好比打游戏的同时抽烟、喝可乐&#xff0c;因此右手一会儿点击鼠标、一会儿抽烟、一会儿喝可乐&#xff0c;所以这种情况可以看作并发&#xff0c;右手就可以看…

4.3.多线程JUC-多线程的实现方式

一.多线程共有3种实现方式&#xff1a; 二.第一种实现方式&#xff1a;继承Thread类的方式进行实现 1.Thread类详解&#xff1a; 如上图&#xff0c;其中解释到线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程&#xff0c;意思是Thread类就表示Java里…

【kylin-Linux】Flash兼容插件包安装

[注意]Adobe Flash已在2020年底停止更新安装思路1.更换apt源2.更新软件源3.安装kylin-flash-plugin步骤1.更换软件源编辑sources.list文件&#xff0c;更换为你需要的源地址&#xff0c;网上有很多开源镜像站&#xff0c;具体自己去网络上寻找。sudo vim /etc/apt/sources.list…

Java毕设项目:基于springboot的网格仓管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【毕业设计】基于springboot的网格仓管理系统的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围::小程序、SpringBoot、SSM、JSP、Vue、PHP、Java、pyth…

Javadoc 常用标签及用法

基础标签1. param - 参数说明/*** 计算两个数的和* param a 第一个加数* param b 第二个加数*/ public int add(int a, int b) {return a b; }2. return - 返回值说明/*** 获取用户姓名* return 用户的姓名&#xff0c;如果不存在返回null*/ public String getName() {return …

2026年不锈钢装饰厂家推荐排行榜:线条、门套、淋浴房、屏风隔断、金属柜与电梯装饰,匠心工艺与时尚设计完美融合

2026年不锈钢装饰厂家推荐排行榜:线条、门套、淋浴房、屏风隔断、金属柜与电梯装饰,匠心工艺与时尚设计完美融合 在现代建筑装饰与室内设计中,不锈钢以其卓越的耐久性、多样的表面处理工艺以及强烈的现代感,已从传…

《构建之法》阅读笔记(团队协作与流程)

团队协作部分的核心在于,通过科学的流程将个人能力整合为高效的集体产出。书中指出,一个成功的软件团队不仅需要优秀的个体,更需要明确的目标、合适的流程与良好的沟通机制。敏捷开发方法,特别是Scrum框架,被重点…

solidity语法

1 ether = 1 000 000 000 gwei  (10⁹ gwei -- 1e9) = 1 000 000 000 000 000 000 wei (10⁸ wei -- 1e18) 学习路径学习区块链基础和solidity和foundry,了解基础的开发- 基础课程:区块链基础,solidity语言开…

学习进度 9

DataFrame 其实是带列名的分布式表格,和 MySQL 里的表、Pandas 里的 DataFrame 逻辑差不多,比纯手写 RDD 算子简单太多。比如之前用 RDD 统计文本行数,得写sc.textFile("file.txt").count(),而 DataFram…

,1月25号

今天依旧。 学习一下java中的接口。 再复习了一下数据库的知识。

2026年电池连接器厂家推荐排行榜:刀片式/弹片式/纽扣式/DC电源插座/Type C/Wafer/XT30/XT60/XT90/新国标2+4,精选高效稳定连接方案

随着全球能源转型的加速和电子设备智能化、便携化趋势的深化,电池作为核心储能单元,其性能与可靠性日益受到关注。而连接器,作为电池与设备之间能量与信号传输的“咽喉要道”,其重要性不言而喻。从新能源汽车的动力…