P1521 求逆序对【洛谷算法习题】
P1521 求逆序对网页链接P1521 求逆序对题目描述我们说( i , j ) (i,j)(i,j)是a 1 , a 2 , ⋯ , a N a_1,a_2,\cdots,a_Na1​,a2​,⋯,aN​的一个逆序对当且仅当i j ijij且a i a j a_ia_jai​aj​。例如[ 2 , 4 , 1 , 3 , 5 ] [2,4,1,3,5][2,4,1,3,5]的逆序对有3 33个分别为( 1 , 3 ) , ( 2 , 3 ) , ( 2 , 4 ) (1,3),(2, 3), (2, 4)(1,3),(2,3),(2,4)。现在已知N NN和K KK求1 , 2 , 3 , ⋯ , N 1,2,3,\cdots,N1,2,3,⋯,N的所有特定排列使得这些排列的逆序对的数量恰好为K KK。输出这些特定排列的数量。例如N 5 N5N5K 3 K3K3的时候满足条件的排列有15 1515个它们是[ 1 , 2 , 5 , 4 , 3 ] [1, 2, 5, 4, 3][1,2,5,4,3][ 1 , 3 , 4 , 5 , 2 ] [1, 3, 4, 5, 2][1,3,4,5,2][ 1 , 3 , 5 , 2 , 4 ] [1, 3, 5, 2, 4][1,3,5,2,4][ 1 , 4 , 2 , 5 , 3 ] [1, 4, 2, 5, 3][1,4,2,5,3][ 1 , 4 , 3 , 2 , 5 ] [1, 4, 3, 2, 5][1,4,3,2,5][ 1 , 5 , 2 , 3 , 4 ] [1, 5, 2, 3, 4][1,5,2,3,4][ 2 , 1 , 4 , 5 , 3 ] [2, 1, 4, 5, 3][2,1,4,5,3][ 2 , 1 , 5 , 3 , 4 ] [2, 1, 5, 3, 4][2,1,5,3,4][ 2 , 3 , 1 , 5 , 4 ] [2, 3, 1, 5, 4][2,3,1,5,4][ 2 , 3 , 4 , 1 , 5 ] [2, 3, 4, 1, 5][2,3,4,1,5][ 2 , 4 , 1 , 3 , 5 ] [2, 4, 1, 3, 5][2,4,1,3,5][ 3 , 1 , 2 , 5 , 4 ] [3, 1, 2, 5, 4][3,1,2,5,4][ 3 , 1 , 4 , 2 , 5 ] [3, 1, 4, 2, 5][3,1,4,2,5][ 3 , 2 , 1 , 4 , 5 ] [3, 2, 1, 4, 5][3,2,1,4,5][ 4 , 1 , 2 , 3 , 5 ] [4, 1, 2, 3, 5][4,1,2,3,5]。输入格式输入共第一行两个整数N NN和K KK。输出格式将1 ⋯ N 1\cdots N1⋯N的逆序对数量为K KK的特定排列的数量输出。为了避免高精度计算请将结果对10000 1000010000取模后再输出。输入输出样例 #1输入 #15 3输出 #115说明/提示数据范围及约定对于全部数据保证N ≤ 100 N \le 100N≤100K ≤ N × ( N − 1 ) / 2 K \le N\times (N-1)/2K≤N×(N−1)/2。解题思路本题是插入法动态规划 滑动窗口优化的经典题型核心是将逆序对的生成过程转化为逐个插入最大元素的累加贡献并用前缀和与对称性优化转移效率。1. 问题等价转化逐步构造排列考虑将数字1 ∼ N 1 \sim N1∼N按从小到大的顺序逐一插入到一个空序列中。由于第i ii个插入的数字i ii是当前最大的无论它放在序列的哪个位置都不会影响已存在数字之间的逆序关系。逆序对贡献将i ii插入到长度为i − 1 i-1i−1的序列中有i ii个可能的插入位置。若插入在从右往左数第p pp个位置p 0 p0p0表示放在最右端p i − 1 pi-1pi−1表示放在最左端则会新产生p pp个逆序对i ii大于前面p pp个数字。DP 定义令g[i][j]表示1 ∼ i 1 \sim i1∼i的所有排列中逆序对总数恰好为j jj的排列个数。则转移方程为g [ i ] [ j ] ∑ p 0 min ⁡ ( j , i − 1 ) g [ i − 1 ] [ j − p ] g[i][j] \sum_{p0}^{\min(j,\,i-1)} g[i-1][j-p]g[i][j]p0∑min(j,i−1)​g[i−1][j−p]初值g[0][0] g[1][0] 1。2. 算法优化直接按上述转移是O ( N 3 ) O(N^3)O(N3)的不可接受。观察到转移是对前一行连续一段元素的求和可以用滑动窗口优化到O ( N K ) O(NK)O(NK)递推式优化对j ≥ 0 j \ge 0j≥0有g [ i ] [ j ] g [ i ] [ j − 1 ] g [ i − 1 ] [ j ] − ( j ≥ i ? g [ i − 1 ] [ j − i ] : 0 ) g[i][j] g[i][j-1] g[i-1][j] - (j \ge i \;?\; g[i-1][j-i] \;:\; 0)g[i][j]g[i][j−1]g[i−1][j]−(j≥i?g[i−1][j−i]:0)这相当于用一个长度为i ii的窗口在g[i-1]上滑动求和。对称性加速对于长度为i ii的排列逆序对的最大值d [ i ] i ( i − 1 ) 2 d[i] \frac{i(i-1)}{2}d[i]2i(i−1)​且分布完全对称即g[i][j] g[i][d[i]-j]。因此只需计算前一半j ≤ d [ i ] / 2 j \le d[i]/2j≤d[i]/2的值后半部分直接复制常数减半。3. 算法步骤初始化d[1]0g[1][0]1代码里同时设了g[0][0]1方便迭代。从小到大遍历i 2 ∼ N i 2 \sim Ni2∼N计算最大逆序对数d[i] d[i-1] i - 1。对j jj从0 00到d[i]/2用滑动窗口公式计算g[i][j]同时注意每一步对g[i-1][j]取模模数10000 1000010000。对j jj从d[i]/2 1到d[i]通过对称性赋值g[i][j] g[i][d[i]-j]。最后输出g[N][K] % 10000。4. 复杂度分析时间复杂度O ( N × K ) O(N \times K)O(N×K)N ≤ 100 N \le 100N≤100K KK最大约4950 49504950计算量约5 × 10 5 5 \times 10^55×105非常充裕。空间复杂度O ( N × K ) O(N \times K)O(N×K)存储 DP 表格。可以滚动数组优化至O ( K ) O(K)O(K)但本题空间限制宽裕未做也无妨。总结将逆序对构造问题转化为逐个插入最大元素的贡献累加利用 DP 进行计数。滑动窗口将转移优化成常数时间对称性减少一半计算量。整体思路清晰代码实现简洁。代码简要说明全局变量与数组d[i]长度为i ii的排列的最大逆序对数。g[i][j]1 ∼ i 1 \sim i1∼i的排列中逆序对数为j jj的方案数全程对10000 1000010000取模。核心循环外层i从 2 到N NN计算d[i]。内层j从 0 到d[i]/2先对g[i-1][j]取模。按滑动窗口公式计算g[i][j]注意g[i][j-1]已在前一步算好需保证计算顺序。若j i减去窗口左侧溢出的项g[i-1][j-i]。用对称性填充j d[i]/2的部分。输出cout g[n][k] % 10000确保取模。代码内容#includebits/stdc.husingnamespacestd;#defineendl\ntypedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N1e310;constll INF1e18;constll M1e610;constll mod1e97;ll n,k,d[105],g[105][5000];intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cinnk;g[0][0]g[1][0]1;for(ll i2;in;i){d[i]d[i-1]i-1;for(ll j0;jd[i];j){g[i-1][j]%10000;if(jd[i]/2){g[i][j]g[i-1][j]g[i][j-1];if(ji)g[i][j]-g[i-1][j-i];}elseg[i][j]g[i][d[i]-j];}}coutg[n][k]%10000endl;return0;}

相关新闻

Free LLM Balancer:构建高可用大语言模型服务的智能调度方案

Free LLM Balancer:构建高可用大语言模型服务的智能调度方案

如果你正在构建基于大语言模型的应用,可能已经遇到了一个典型困境:本地部署成本低但性能有限,云端API稳定但费用高昂且存在数据隐私顾虑。更棘手的是,当单一服务节点过载或故障时,整个应用就会陷入瘫痪。最近在开发者社…

2026/7/24 18:46:17阅读更多 →
AI决策辅助系统:多模态大模型在生活场景中的应用

AI决策辅助系统:多模态大模型在生活场景中的应用

1. 项目概述:AI如何成为你的全能生活顾问 上周我帮朋友搬家时,在他衣柜前站了整整半小时——不是体力不支,而是被"明天穿什么"这个世纪难题困住了。这种场景你一定不陌生:早上站在衣柜前发呆,超市货架前反复…

2026/7/24 18:46:17阅读更多 →
【单片机毕业设计推荐】基于 STM32 的智能输液监测预警系统设计与实现,基于 STM32 的多参数输液安全监控装置设计(013803)

【单片机毕业设计推荐】基于 STM32 的智能输液监测预警系统设计与实现,基于 STM32 的多参数输液安全监控装置设计(013803)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能基础功能核心监测功能自动控制功能异常预警功能参数配置辅助功能技术路线项目演示关于我们项目案例源码获取博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业&#x1f6…

2026/7/24 18:44:17阅读更多 →
AI获客+自动成交+客户留存全闭环,创业者私藏的9件套工具清单,仅开放72小时下载!

AI获客+自动成交+客户留存全闭环,创业者私藏的9件套工具清单,仅开放72小时下载!

更多请点击: https://intelliparadigm.com 第一章:AI获客自动成交客户留存全闭环方法论 在数字化营销纵深演进的当下,单一工具或孤立环节已无法支撑可持续增长。真正的增长引擎,是将获客、转化与留存嵌入统一智能体中&#xff0c…

2026/7/24 21:46:49阅读更多 →
提示词格式控制实战指南:3步精准锁定输出结构,告别杂乱无章响应

提示词格式控制实战指南:3步精准锁定输出结构,告别杂乱无章响应

更多请点击: https://kaifayun.com 第一章:提示词格式控制的核心价值与认知重构 在大语言模型应用实践中,提示词(Prompt)并非简单的自然语言输入,而是具备结构化语义与执行契约的“程序接口”。格式控制—…

2026/7/24 21:46:49阅读更多 →
React+Three.js 实现 Apple 热成像 logo

React+Three.js 实现 Apple 热成像 logo

React Three.js 实现 Apple 热成像 Logo 引言热成像效果是一种通过颜色渐变来表现温度分布的可视化技术,在工业检测、医疗影像和艺术创作中都有广泛应用。本文将带你从零开始,使用 React 和 Three.js 构建一个动态的 Apple logo 热成像效果。我们将从基…

2026/7/24 21:46:49阅读更多 →
从0到1构建AI模型评估实验室:含自动化测试脚本、偏见检测模板、推理延迟压测方案(限前200家企业领取)

从0到1构建AI模型评估实验室:含自动化测试脚本、偏见检测模板、推理延迟压测方案(限前200家企业领取)

更多请点击: https://intelliparadigm.com 第一章:企业AI模型选择建议 企业在落地AI应用时,模型选择不应仅聚焦于“最先进”或“参数量最大”,而需围绕业务目标、数据特征、工程约束与长期维护成本进行系统性权衡。盲目引入大模型…

2026/7/24 21:46:49阅读更多 →
Java虚拟机:堆的参数配置

Java虚拟机:堆的参数配置

一、JVM堆内存结构概览JVM将堆内存划分为几个不同的区域,每个区域有着不同的用途和回收策略:1.1 新生代(Young Generation)新生代是大多数对象创建和消亡的地方。它进一步分为三个区域:Eden空间:新创建的对…

2026/7/24 21:46:49阅读更多 →
手把手教你学pcie-第二种:MMIO 空间(Memory-Mapped I/O)

手把手教你学pcie-第二种:MMIO 空间(Memory-Mapped I/O)

目录 五、第二种:MMIO 空间(Memory-Mapped I/O) 1️⃣ MMIO 是什么? 2️⃣ MMIO 和配置空间的本质区别 3️⃣ MMIO 从哪里来? 4️⃣ CPU 眼中的 MMIO 5️⃣ Linux 驱动如何访问 MMIO? ✅ 第一步&…

2026/7/24 21:44:49阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →