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

c++重要知识点汇总(不定期更新)

前言

真心希望各位dalao点赞+收藏~

树状数组

作用:高效求出区间前缀和,允许进行修改操作。 举个栗子: 刚开始有8项,分别为1-8。 首先构建二叉树:

			   1-8/ |/  |/   |/    |/     |1-4     5-8/ |	    / |/  |    /  |1-2 3-4 5-6 7-8/ | / | / | / |1  2 3 4 5 6 7 8

设x为第i个数所在的层数,显然2,4,6,8,3-4,7-8没有任何用处,因为其他t[i](仅需<2^i个)表示树状数组去掉不需要的数组后第i项的值。

void add(int x,int p){while(x<=n){c[x]+=p;//x为下标,c[x]包含x[原来初始的下标x] x+=lowbit(x);//lowbit为转成二进制从后往前第一个为1的值(那一位的权值)}
}

(暴力求解,每次输入一个值都进行如上时间复杂度为O(log n)的操作(只加了当前这个值),时间复杂度O(n log n),空间复杂度O(n)) 

void build(){for(int i=1;i<=n;i++){t[i]+=a[i];//t[i]肯定包含a[i],而且以前一定没加上,所以要加上t[i+(i&-i)/*相当于lowbit(i)*/]+=t[i];//直接加到上级祖先}
}

(优化求解,直接一次性加给他的祖先,时间复杂度O(n),空间复杂度O(2n)) 

以上两种建树方法各有优劣,相当于一个时间空间互换的过程。 

拓展类型1: 1.求逆序数(对)问题 逆序数是指在第i个数前有多少个>第i个数的数。

树状数组的作用是求出前缀和, 所以我们可以使用类似于桶排序的原理,桶[i]表示i在此时出现的次数。

只需要求第i个数的时候就把桶[第i个数]++就可以了。

PS:一般用离散化使其空间复杂度变小且下标连续。

http://www.xdnf.cn/news/498007.html

相关文章:

  • flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...
  • Linux基础开发工具二(gcc/g++,自动化构建makefile)
  • OpenCV级联分类器
  • gRPC开发指南:Visual Studio 2022 + Vcpkg + Windows全流程配置
  • ABP vNext 多租户开发实战指南
  • Uniapp开发鸿蒙应用时如何运行和调试项目
  • 中级统计师-统计学基础知识-第二章数据描述
  • 产品经理入门(2)产品体验报告
  • 深入解析SpringMVC:从入门到精通
  • uniapp自动构建pages.json的vite插件
  • 多商户商城系统源码解析:开发直播电商APP的技术底层实战详解
  • python线程相关讲解
  • uni-app 开发HarmonyOS的鸿蒙影视项目分享:从实战案例到开源后台
  • 显卡、Cuda和pytorch兼容问题
  • Rust 数据结构:HashMap
  • PostGIS实现栅格数据入库-raster2pgsql
  • 端口443在git bash向github推送时的步骤
  • 轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
  • 【C++ Qt】布局管理器
  • redis的pipline使用结合线程池优化实战
  • Java大师成长计划之第25天:Spring生态与微服务架构之容错与断路器模式
  • Qt 强大的窗口停靠浮动
  • Javascript:WebAPI
  • React Fiber 架构深度解析:时间切片与性能优化的核心引擎
  • ARM (Attention Refinement Module)
  • spring -MVC-02
  • DeepSeek赋能电商,智能客服机器人破解大型活动人力困境
  • 数组集合互转问题
  • Ubuntu 安装 squid
  • 服装零售逆势密码:从4月英国7%增长看季节性消费新模型