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

高级数据结构-树状数组

介绍

树状数组的推导

两个基础操作

模板-acwing795. 前缀和

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10;
int c[N]; 

int lowbit(int x){
	return x & -x;
}

int query(int x){
	int ans = 0;
	for(; x; x -= lowbit(x)) ans += c[x];
	return ans;
}

void add(int x,int y){
	for(; x <= N; x += lowbit(x)) c[x] += y;
}

int main(){
	int n,m; scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; i++){
		int num; scanf("%d",&num);
		add(i,num);
	}
	while(m--){
		int l,r; scanf("%d%d",&l,&r);
		printf("%d\n",query(r)-query(l-1));
	}
	return 0;
} 

模板-acwing5910. 求逆序对

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 1e6+10;
LL c[N],a[N];

int lowbit(int x)  // 返回末尾的1
{
    return x & -x;
}

LL query(int x){
    LL ans = 0;
    for(; x; x -= lowbit(x)) ans += c[x];
    return ans;
}

void add(int x,int y){
    for(; x <= N; x += lowbit(x)) c[x] += y;
}

int main()
{
    LL ans = 0;
    int n; scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        scanf("%d",&a[i]);
    }
    //倒序扫描,找值比当前这个数小但是先进入树状数组的数,即1-(a[i]-1)的和
    for(int i = n; i >= 1; i--){
        ans += query(a[i]-1)-query(0);
        add(a[i],1);
    }
    printf("%lld\n",ans);
    return 0;
}


http://www.kler.cn/a/429141.html

相关文章:

  • Halcon_数据类型_ROI_仿射变换_投影变换
  • 设计模式 在SCM系统的应用场景介绍
  • ISO45001职业健康安全管理体系认证流程
  • springboot整合lua脚本在Redis实现商品库存扣减
  • 关系型数据库(RDBMS)和非关系型数据库(NoSQL)
  • 使用 Trace 实现 onnx 的导出 - 学习记录
  • golang学习,小结
  • 数学公式和科学符号在页面的展示方法
  • 去除背景 学习笔记
  • PCB设计规范
  • 运维监控grafana+prometheus+node_exporter(or mysqld_exporter)
  • 手动将MJPEG图片,转成MP4文件格式
  • centOS7如何配置阿里云或者腾讯云yum源
  • 【Linux】搭建临时HTTP文件传输服务器
  • uniapp支持App横竖屏开发总结
  • iPhone 17 Air基本确认,3个大动作
  • 嵌入式学习——进程间通信方式(5)—— 信号量
  • 22. 五子棋小游戏
  • 阿里云PolarDB 如何进行数据恢复,文档总结
  • 【Qt】QMainWindow、QWidget和QDialog的区别?