数学基础
取模运算
取模运算的一些性质:
位运算
快速幂
如果直接计算 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 abmodp,0<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 双端队列结构实现