竞赛常用加速技巧#模板

快读

整数快读
复制代码
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;
    }
}
相关推荐
-dzk-2 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅3 小时前
hot100 78.子集
java·算法
Jasmine_llq3 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪3 小时前
快速进制转换
笔记·算法
m0_706653233 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你913 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
qq_423233904 小时前
C++与Python混合编程实战
开发语言·c++·算法
TracyCoder1234 小时前
LeetCode Hot100(19/100)——206. 反转链表
算法·leetcode
m0_715575344 小时前
分布式任务调度系统
开发语言·c++·算法