week 5-数学基础与方法应用

本文深入探讨了数学基础在算法中的应用,包括取模运算的性质、快速幂的递归实现、前缀和与差分数组的概念及其在区间查询与修改中的作用。此外,还介绍了尺取法在数组操作中的应用,以及单调栈和单调队列在求解最值问题时的优势。单调栈具有全局性,而单调队列则保持局部单调性,两者在解决某些特定问题时十分有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数学基础

取模运算

在这里插入图片描述
取模运算的一些性质:
在这里插入图片描述

位运算

在这里插入图片描述

快速幂

如果直接计算 a b m o d p , 0 < a , b , p < 1 0 9 a^b\quad mod\quad p,0 < a,b,p <10^9 abmodp0<a,b,p<109

在这里插入图片描述

long long qpow(long long a,long long b,long long p){
	if(!b) return 1;
	// 向下递归, b不断折半,计算 b 为不同值的时候,模是多少
	long long now = qpow(a,b/2,p); 
	// 递归返回上层
	if(b&1) return a*now%p*now%p;
	else return now%p*now%p;
}
// 一行写法

long long qpow(long long a ,long long b,long long p){
	long long ans = 1;
	for(a%p; b ;a = a*a%p,b >>= 1)
		if(b&1) ans = ans*a %p;
	return ans;
} 

前缀和与差分

前缀和

二维前缀和

在这里插入图片描述
用一个二维数组,表示一个左上角区域的和,
sum[x,y]表示左上角 0-x ,0-y 所元素之和

  • 构造 : sum[x,y] = sum[x-1, y] + sum[x, y-1] - sum[x-1, y-1] + a[x, y]
  • 获取(a-c, b-d)区域的和 SUM = sum[c,d] - sum[c, b-1] - sum[a-1,d] + sum [a-1, b-1]

差分

原数组A , 差分数组B,数组范围[1, n]

  • 构造: B[1] = A[1] - A[0] = A[1]
  • B[i] = A[i] - A[i-1]

差分特点:

  • 前缀和时元素值 ∑ B [ 1... i ] = A [ i ] \sum B[1...i] = A[i] B[1...i]=A[i]
  • 原数组的区间修改,可以转换成差分数组的单点修改
    A[L] 之后所有元素加 +C ,对应的差分数组,仅仅修改B[L]
    如果 仅仅修改A[L]~A[R] 均加上c,等价于B[L] += c ,B[R+1] -= c

尺取法

俗称 双指针法,是数组的常见操作

在这里插入图片描述

在这里插入图片描述

单调栈

在这里插入图片描述
如果矩形的高度确定,左端点越靠左,右端点越靠右,矩形的面积才可能最大。

利用单调栈,如果是一个单调递减栈,一个更高的长方形加入,那么左侧从当前位置开始遇到的首个矮长方形,将会被pop,由此找到左端点,同理可以找到右端点。

可以计算,以每个长方形的高度求长方形面积时的最大面积。

单调队列

举例单调递增队列

  • 如果队列为 空 或者队尾元素 小于 入队元素,则入队
  • 否则,入队则会破坏队内元素的单调性,则需要将不满足条
    件的队尾元素全部出队后,将入队元素入队

单调队列和单调栈的区别

  • 单调栈有全局性
  • 单调队列维护局部单调性

使用 deque 双端队列结构实现

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值