当前位置: 首页 > 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.jsqmd.com/news/20724/

相关文章:

  • 大模型 | VLA 初识及在自动驾驶场景中的应用
  • Redis中的分布式锁之SETNX底层实现
  • 2025家纺摄影公司推荐,南通鼎尚摄影专注产品视觉呈现
  • ExPRT.AI如何预测下一个将被利用的漏洞
  • 求函数
  • AI元人文构想的跨学科研究:技术实现与人文影响分析——对自由与责任的再框架化(DeepSeek基于Ai元人文系列文章研究)
  • Python---简易编程解决工作问题
  • DM8 安装包 for linux_x86
  • 日总结 16
  • MPK(Mirage Persistent Kernel)源码笔记(1)--- 基础原理
  • 背包dp(1)
  • 模拟can通信
  • 202501软件工程第二次团队作业
  • 题解:P14174 【MX-X23-T4】卡常数
  • 比赛题解 总结
  • 解题报告-拯救计划(概率 DP)
  • 解码Linux文件IO之库的制作与应用
  • 20251023 正睿二十连测
  • 1019:浮点数向零舍入(分正负取整)
  • 创建 SQL Server 数据库【通用】
  • HNSW算法实战:用分层图索引替换k-NN暴力搜索
  • 日志分析-IIS日志分析
  • Spring Boot 自动配置之 TaskExecutor - 实践
  • 二分图/忆re.
  • 编程与数学 03-009 Linux 操作系统应用 22_Linux 故障排除与问题克服
  • 《IDEA 2025长效采用配置指南:有效期配置至2099年实战之JetBrains全家桶有效》​
  • 如何制作PDF文件目录? - 详解
  • todesk远程到被控Mac后能看到画面,鼠标键盘执行无反应
  •  pytorch 66页实验题
  • 10/23