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

2026.04.07 作业- # AT_abc452_f [ABC452F] Interval Inversion Count

AtCoder ABC 452 F 中文题面(Interval Inversion Count)

题目名称

区间逆序对计数

问题描述

给定一个正整数 \(N\),以及一个由 \(1,2,\dots,N\) 组成的排列 \(P=(P_1,P_2,\dots,P_N)\)
再给定一个非负整数 \(K\)

请你求出满足以下两个条件的整数对 ((l,r)) 的个数:

  1. \(1 \le l \le r \le N\)(即 \([l,r]\) 是原序列的一个连续子区间
  2. 子区间 \(P_l,P_{l+1},\dots,P_r\) 中,逆序对的数量恰好等于 \(K\)

定义

  • 逆序对:在区间 \([l,r]\) 中,满足 \(i<j\)\(P_i>P_j\) 的数对 \((i,j)\) 称为一个逆序对。
  • \(\text{inv}(l,r)\) 为区间 \([l,r]\) 的逆序对总数。

输入格式

N K
P_1 P_2 ... P_N
  • 第一行:两个整数 \(N,K\), \((1 \le N \le 5 \times 10^5\) ,\(0 \le K \le \frac{N(N-1)}{2}\)
  • 第二行:\(N\) 个整数,表示排列 \(P\) $ (1 \le P_i \le N$,所有 \(P_i\) 互不相同)

输出格式

输出一个整数,表示满足条件的 \((l,r)\) 的个数。

样例输入1

7 3
1 4 3 2 5 6 7

样例输出1

8

样例解释

满足条件的区间为:
([1,4],[1,5],[1,6],[1,7],[2,4],[2,5],[2,6],[2,7]),共 8 个。

数据范围

  • \(1 \le N \le 5 \times 10^5\)
  • \(0 \le K \le \frac{N(N-1)}{2}\)
  • \(P\)\(1\)\(N\) 的排列

思考过程

  1. 问题:逆序对个数为k的子区间个数。
  2. 思考:固定左端点 l,r in [l,n] , g[r] 右端点为r的逆序对个数,g[r] 函数具有单调性。
  3. 序列[1,4,3,2,5,6,7], 若 k=3,l=1, 满足条件的区间 [1,4],[1,5],[1,6],[1,7].
    若 k=3, l=2, 满足条件的区间 [2,4],[2,5],[2,6],[2,7]
  4. 对于左端点l,满足条件的右端点r,不止一个。
  5. 问题转化为:函数F(k) 表示 逆序对数量<=k的区间的个数。满足条件的右端点有且仅有1个。 Ans=F(k)-F(k-1) 对于左端点l,存在一个 r,满足[,r]逆序对的数量>k ,则[l,r-1]一定满足逆序对的数量<=k, cnt[l]=(r-1)-(l-1)=r-l
  6. 动态维护: 增加一个右端点r,贡献值为正数, j in [l,r-1]中, p[j]>p[r]的个数。转化为 :Qry(n)-Qry(p[r])
    删除一个做端点l,贡献值为负数, j in [l+1,r]中, p[j]<p[l]的个数。Qry(p[l]-1)

题目要点

  1. 核心:统计恰好含 \(K\) 个逆序对的连续子区间数量
  2. 关键转化:直接求“恰好 \(K\)"" 困难,常用方法是

\[ \text{答案} = F(K) - F(K-1) \]

其中 \(F(m)\) 表示逆序对数量 \(\le m\) 的子区间总数
3. 高效解法:双指针(尺取法)+ 树状数组,时间复杂度 \(O(N\log N)\),适配 \(N=5e5\) 的数据规模

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MaxN=500005;
int n,p[MaxN],c[MaxN];
LL k;
void Add(int x,int v){for (;x<=n;x+=x&-x) c[x]+=v;
}
int Qry(int x) {int s=0;for (;x>0;x-=x&-x) s+=c[x];return s;
}LL CNT(LL m) {if (m<0) return 0;  //经典错误,m==0,不是return 0;LL sum=0;LL s=0;memset(c, 0, sizeof(c));int r=0;for (int l=1;l<=n;l++) {while (r<n && s<=m) {r++; s+=Qry(n)-Qry(p[r]);Add(p[r],1);}if (s>m) sum+=r-l; else sum+=n-l+1;Add(p[l],-1);s-=Qry(p[l]-1);}return sum;
}
int main() {scanf("%d%lld",&n,&k);for (int i=1;i<=n;i++) scanf("%d",&p[i]);LL Ans=CNT(k)-CNT(k-1);cout<<Ans<<endl;return 0;
}
http://www.jsqmd.com/news/646718/

相关文章:

  • 【技巧】MAC外接显示屏的实用设置与优化
  • 从无人机到平衡车:深入聊聊STM32上IMU数据融合里的那些‘权重’游戏
  • 串口调试翻车实录:当Stick Parity遇到CH340芯片时的诡异丢包问题
  • 34岁产品经理硬核转型AI!2年踩坑经验告诉你:想转行?先掌握这个核心能力!
  • 中医AI革命:如何用7B参数打造超越GPT-4的专业中医助手?
  • 卷积改进与轻量化:大核卷积的极致:使用 31×31 深度卷积 + 结构重参数化,有效感受野翻倍
  • Ostrakon-VL-8B开源镜像实测:无需CUDA驱动预装,容器内自动适配GPU环境
  • NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的4个秘密
  • RePaint: 基于去噪扩散概率模型的图像修复技术解析与实践
  • 华为认证如何助力职业跃迁?HCIA到HCIE的进阶路径与薪资增长分析
  • 基于主从博弈的动态定价策略与电动汽车充电管理优化研究在智能小区的实践探索
  • 别再乱用Hive分区了!手把手教你用日期和地域分区优化TB级数据查询(附实战SQL)
  • Ubuntu Autoinstall Generator:终极自动化部署解决方案
  • 5分钟在macOS上安装Whisky:终极Windows应用兼容解决方案
  • 告别振铃!用PSIM和Simulink手把手教你调Boost双闭环PI参数(附完整计算过程)
  • Substance Painter高效快捷键指南
  • GPT-6震撼发布!OpenAI引领AI革命,200万Token大模型将如何重塑未来?
  • 1.6-抓包实战:从Burp Suite到Yakit,打通Web、APP、小程序流量分析
  • 避坑指南:GraalVM Native-Image在Windows环境下的5个常见错误及解决方法
  • DPO VS GRPO
  • 专业无人机日志数据分析:UAV Log Viewer完整实战指南
  • Office2021完美兼容Mathtype6的保姆级教程(附文件路径详解)
  • 生成式AI不是烧钱游戏:用ROI驱动型架构设计法,90天重构盈利路径(附金融/医疗/制造三大行业落地方案)
  • BCI Competition IV 2a数据集深度解析:除了读取.gdf,你更该关注这些实验设计与数据细节
  • OpenHarmony XTS测试实战:从零手把手教你为智能手表写一个C语言兼容性用例
  • 铜钟音乐:在广告泛滥的时代,如何找回纯粹的听歌体验?
  • 山河砺志 墨韵润心 “李体书法”创始人李送文的奋斗人生 - 速递信息
  • 保姆级教程:手把手解决MDT制作WinPE启动盘时的“找不到路径”报错
  • Windows/Linux双平台实测:TruevisionDesigner编辑OpenDRIVE地图的5个高效技巧
  • 告别示教器:用MoveIt2和Universal_Robots_ROS2_Driver玩转UR机械臂仿真运动规划