1,快速幂算法模板
求 mk%p,时间复杂度 O(logk)。
int qmi(int m, int k, int p)
{
int res = 1 % p, t = m;
while (k)
{
if (k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}
2,二分查找算法模板
二分模板一共有两个,分别适用于不同情况。
算法思路:假设目标值在闭区间 [l, r] 中, 每次将区间长度缩小一半,当 l = r 时,我们就找到了目标值。
版本1
当我们将区间 [l, r] 划分成 [l, mid] 和 [mid + 1, r] 时,其更新操作是 r = mid 或者 l = mid + 1;,计算mid时不需要加1。
C++ 代码模板:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
版本2
当我们将区间 [l, r] 划分成 [l, mid - 1] 和 [mid, r] 时,其更新操作是 r = mid - 1 或者 l = mid ;,此时为了防止死循环,计算mid时需要加1。
C++ 代码模板:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
3,快速排序模板 + 理解
模板代码
void quick_sort(int q[], int L, int R){
if(L >= R) return;
int x = q[L], i = L - 1, j = R + 1;
while(i < j){
do i ++; while(q[i] < x);
do j --; while(q[j] > x);
if(i < j) swap(q[i], q[j]);
}
quick_sort(q, L, j);
quick_sort(q, j + 1, R);
}
4, 双指针模板小总结
题目链接:https://www.acwing.com/problem/content/description/802/
模板:
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++ ;
// 具体问题的逻辑
}
代码:
#include<iostream>
using namespace std;
const int N=1000010;
int a[N],b[N];
int n,m,k;
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
for(int i=1,j=m;i<=n;i++){
while(j>0&&a[i]+b[j]>k)
{
j--;
}
if(j>0&&a[i]+b[j]==k)
cout<<i-1<<" "<<j-1<<endl;
}
return 0;
}