竞赛常用加速技巧#模板

快读

整数快读
复制代码
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;
    }
}
相关推荐
会唱歌的小黄李32 分钟前
【算法】贪心算法:最大数C++
c++·算法·贪心算法
NuyoahC35 分钟前
笔试——Day8
c++·算法·笔试
Pi_Qiu_1 小时前
Python初学者笔记第十三期 -- (常用内置函数)
java·笔记·python
墨染点香1 小时前
LeetCode Hot100 【1.两数之和、2.两数相加、3.无重复字符的最长子串】
算法·leetcode·职场和发展
秋说2 小时前
【PTA数据结构 | C语言版】二叉树层序序列化
c语言·数据结构·算法
NuyoahC2 小时前
笔试——Day9
数据结构·c++·笔试
地平线开发者2 小时前
开发者说|Aux-Think:为什么测试时推理反而让机器人「误入歧途」?
算法·自动驾驶
mit6.8242 小时前
[Meetily后端框架] 多模型-Pydantic AI 代理-统一抽象 | SQLite管理
c++·人工智能·后端·python
Tiny番茄2 小时前
46. 携带研究材料(01背包二维数组)
算法·动态规划
雨落倾城夏未凉2 小时前
从零构建INI配置工具的分步指南
c++·后端·qt