前缀和
前缀和
1.前缀和理解与实现
为什么要用前缀和?
前缀和顾名思义就是前几个数的和,arg[n]
即为前n个数的和。这样当我们需要区间(l,r)
的和时只需要求prefix[r]-prefix[l-1]
.
若我们选择遍历大小为n的数组,询问次数为q次。则时间复杂度为O(qn)
。
而使用前缀和我们只需要花O(n)
遍历数组,再花O(1)
求得所需。
前缀和的实现
1.手写
开新的数组
1 | vector<int>prefix(n); |
原数组不用了
1 | for(int i=0;i<n;i++) |
2.库函数
1 | //numeric库 |
需要注意的点
需要注意下标为0时的数组越界
解决方法:
1.0特判
1 | auto sumOf=[&](int l,int r){ |
2.从1开始
1 | //numeric库 |
2.前缀和变种
1.前缀积
同理,但是造成了容易溢出的问题。mul(l,r)=prefix[r]/prefix[l-1]
我们通常会取模,但是这样mul就并不是简单的除法运算,需要用乘法逆元。如费马小定理等。
2.前缀异或和
xor(l,r)=prefix[r]^prefix[l-1]
前缀异或和有一个有趣的性质:有两个前缀相同,则区间的异或和为0。
实现
1 | partial_sum(arr.begin(),arr.end(),xorsum.begin(),[](int prev,int cur){ |
3.二维前缀和
左上角到某地方的前缀和,依据容斥原理sum(x1,y1,x2,y2)=p[x2][y2]-p[x1][y2]-p[x2][y1]=p[x1][y1]
4.普遍前缀和
我们可以将前缀推广到任意运算,如max,min……但由于没有逆运算,不能求解区间问题。但面对多次查询还是适用的。
2.后缀和
用于求解终点与当前位置的信息。
实现
1 | for(int i=n-1;i>=0;i--){ |
Maven
Maven
1.安装与IDEA使用
不赘述
2.依赖管理
1.简介
Maven使用pom.xml文件来定义项目依赖。
依赖的坐标
- GroupId:组织或项目的唯一标识符,通常用反向域名命名
- ArtifactId:项目或依赖名称。同组中有唯一性。
- Version:版本号
- Packaging:打包类型
1 | //一个依赖示例 |
依赖管理
1 | //properties设置版本号 |
依赖冲突:项目A依赖库B,B依赖C版本,A依赖C另一版本。Maven采取最近路径优先策略,选择离项目最近的一项,若距离相同则根据POM文件声明顺序。
3.构建管理
生命周期
- validate:验证项目是否正确和所有必要信息是否可用。
- compile:编译项目的源代码。
- test:使用适当的单元测试框架(如 JUnit)测试编译好的代码。
- package:将编译后的代码打包成可分发的格式(如 JAR、WAR)。
- verify:运行任何集成测试来验证软件包的有效性。
- install:将软件包安装到本地 Maven 仓库,以供本地项目使用。
- deploy:将最终的构建结果复制到远程仓库,以供其他开发人员和项目共享。
4.Maven继承
子项目继承父项目的配置。通过继承机制,子项目可以复用父项目定义的依赖、插件、属性等配置,减少重复配置,提高项目的可维护性。
1 | <parent></parent> |
5.Maven聚合
聚合是指在一个父项目中管理多个子项目,使得构建和管理多个模块变得更加方便。在聚合项目的根目录中运行 Maven 命令,可以同时构建和管理所有子项目。
聚合项目(Aggregator Project)本身通常不包含代码,仅用于组织和管理子项目
聚合项目的 POM 文件通过 <modules>
元素定义了包含的子项目。通过聚合,可以一次性构建和管理所有子项目。简化了构建和发布过程。
1
2
3<modules>
<module></module>
</modules>