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

树状数组求逆序对

统计对于每个i<j,求a[i]>a[j]的数量
在每一次更新(update)树状数组时,以元素的值作为树状数组的索引,更新的值为 +1,代表个数。

在每一次获取(query)逆序对数时,存在于树状数组中的元素的索引值都比当前元素的大(逆序遍历),

那么自然获取到的树状数组的值即为索引值比当前元素的大,且值比当前元素的小的个数。

从排列中的最后一个数开始遍历,每次在树状数组中查询有多少个数小于当前的数P[j]

(即用树状数组查询数组A目前P[j]−1个数的前缀和)并加入计数器,之后对树状数组执行修改数组A第P[j]个数值加1的操作。

#include<bits/stdc++.h>using namespace std;using ll=long long;
const int N=5e5+5;
int n,rng;
int a[N],org[N];
struct TreeArray{
private:ll bitree[N];
public:ll lowbit(int x){	return x&(-x);}void update(int pos,int val){for(;pos<=rng;pos+=lowbit(pos)) bitree[pos]+=val;//注意,下标为离散化后的值域}ll query(int pos){int res=0;for(;pos;pos-=lowbit(pos)) res+=bitree[pos];return res;}
};
TreeArray tree;int main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n;for(int i=1;i<=n;++i){cin>>a[i];org[i]=a[i];//保存原数据}sort(a+1,a+1+n);rng=unique(a+1,a+1+n)-a-1;//离散化的步骤,在部分题目中不是必需的ll ans=0;for(int i=n;i>=1;--i){int tmp=lower_bound(a+1,a+1+rng,org[i])-a;//获取排名ans+=tree.query(tmp-1);tree.update(tmp,1);}cout<<ans<<'\n';return 0;
}
http://www.zskr.cn/news/28733.html

相关文章:

  • ExPRT.AI如何预测下一个将被利用的漏洞
  • AI元人文构想的跨学科研究:技术实现与人文影响分析——对自由与责任的再框架化(DeepSeek基于Ai元人文系列文章研究)
  • 日总结 16
  • 解码Linux文件IO之库的制作与应用
  • 20251023 正睿二十连测
  • 日志分析-IIS日志分析
  • Visual Studio 插件 - 喝水提醒 - 指南
  • 10/23
  • 玛哈特十一辊矫平机:把金属板送进“11 次节拍器” - 教程
  • 第3天(中等题+简单题 数组、滑动窗口)
  • ollama v0.12.2 版本更新详解:Qwen3 架构协助、Multi-Regex 分词器、新引擎前后缀匹配等功能升级
  • MySQL主从同步读写分离
  • SwiftUI NavigatorStack 导航容器
  • 深入解析:【仿生机器人】基于 GPT-SoVITS 的 发声器
  • PCL1.12 解决memory.h中EIGEN处中断问题
  • 20251023
  • Java常用机制 - SPI机制详解
  • 2025.10.23——2绿2蓝
  • 采用opencv来识别信用卡的号码
  • 精读《C++20设计模式》:重新理解设计模式系列 - 详解
  • 《程序员修炼之道:从小工到专家》阅读笔记1
  • ski 和 db 模块的通信
  • rocky10自己手动换源
  • layui时间与日期选择器,时间范围查询数据,后端springboot
  • 轻量级图片信息解析程序
  • 2025.10.23 闲话-全局位运算 max 的解法
  • express 模块学习 - 东方不败-
  • 习题-无限集与选择公理
  • 题解:CF2115F1 Gellyfish and Lycoris Radiata (Easy Version)
  • 2025铁氟龙/极细铁氟龙/UL系列高温线厂家推荐明秀电子,专业耐用品质保障!