竞赛常用加速技巧#模板

快读

整数快读
复制代码
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

快读的基本原理

  1. 字符流处理

    快读函数直接使用getchar()逐个读取字符,避免了标准输入函数的类型解析和缓冲区开销。对于大规模数据(如百万级整数),这种方式的效率远高于scanfcin

  2. 手动解析整数

    函数将连续的数字字符手动转换为整数,跳过非数字字符(如空格、换行符),并处理符号位(-)。

  3. 位运算优化

    代码中x = x*10 + c-'0';是核心转换逻辑,相当于:

    • 将当前累计值x左移一位(乘以 10)。
    • 将字符c转换为对应的数值(c-'0')。
    • 累加得到新的数值。
快读模板#不止整数
复制代码
template <typename T>
inline void read(T &x) {
    int c = getchar();
    x = 0;
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') {
        x = x * 10 + (c - '0');
        c = getchar();
    }
}
关闭同步流(C++)
复制代码
ios::sync_with_stdio(false);
cin.tie(nullptr);

二分查找

复制代码
int ans=lower_bound(a+1,a+n+1,x)-a;//二分搜,注意-a

手搓版

复制代码
int find(int x) 
{
	int l=1,r=n;
	while (l<r)
	{
		int mid=l+(r-l)/2;
		if (a[mid]>=x) r=mid;
		else l=mid+1;
	}
	
	if (a[l]==x) return l; 
	else return -1;
}

循环展开

复制代码
// 原始循环
for (int i = 0; i < n; ++i) {
    sum += arr[i];
}

// 展开后的循环(假设 n 是 4 的倍数)
for (int i = 0; i < n; i += 4) {
    sum += arr[i] + arr[i+1] + arr[i+2] + arr[i+3];
}
原理
  • 减少分支预测错误
    循环中的 for/while 语句需要每次检查终止条件,展开后减少了条件判断次数。
  • 提高指令级并行
    CPU 可以同时处理多个操作(如 sum += arr[i] + arr[i+1] + ...),减少流水线停顿。
  • 适用场景:循环次数固定且较大时效果显著(如处理数组)。

位运算优化#快速幂

复制代码
x % 2  →  x & 1
x / 2  →  x >> 1
x * 2  →  x << 1

// 快速幂
int pow(int a, int n) {
    int res = 1;
    while (n > 0) {
        if (n & 1) res *= a;
        a *= a;
        n >>= 1;
    }
    return res;
}

内联函数

复制代码
inline int add(int a, int b) {
    return a + b;
}

一般情况,程序会自动内联,可以不用

预计算优化

复制代码
// 预处理阶乘模数组
const int MOD = 1e9 + 7;
const int MAXN = 1e6;
long long fact[MAXN + 1];

void init() {
    fact[0] = 1;
    for (int i = 1; i <= MAXN; ++i) {
        fact[i] = fact[i-1] * i % MOD;
    }
}
相关推荐
点云SLAM9 分钟前
PyTorch 中.backward() 详解使用
人工智能·pytorch·python·深度学习·算法·机器学习·机器人
only-qi38 分钟前
146. LRU 缓存
java·算法·缓存
yuxb731 小时前
Docker学习笔记(二):镜像与容器管理
笔记·学习·docker
梁辰兴2 小时前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Murphy_lx2 小时前
Lambda表达式
开发语言·c++
yangpipi-2 小时前
C++并发编程-23. 线程间切分任务的方法
开发语言·c++
野犬寒鸦2 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
菜鸟得菜2 小时前
leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
数据结构·算法·leetcode
楼田莉子3 小时前
C++算法专题学习——分治
数据结构·c++·学习·算法·leetcode·排序算法
一支鱼4 小时前
leetcode常用解题方案总结
前端·算法·leetcode