竞赛常用加速技巧#模板

快读

整数快读
复制代码
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;
    }
}
相关推荐
CoderCodingNo3 分钟前
【GESP】C++四级真题 luogu-B4416 [GESP202509 四级] 最长连续段
开发语言·c++·算法
xjxijd3 分钟前
工业元宇宙 IDC 支撑:数字孪生算法 + 边缘服务器,生产调度响应速度提 3 倍
运维·服务器·算法
找方案5 分钟前
hello-agents 学习笔记:智能体发展史 —— 从符号逻辑到 AI 协作的进化之旅
人工智能·笔记·学习·智能体·hello-agents
程序员zgh14 分钟前
代码重构 —— 读后感
运维·c语言·开发语言·c++·重构
蒙奇D索大19 分钟前
【数据结构】考研408 | 平方探测法精讲:跳跃探查的艺术与聚集迷思
数据结构·笔记·考研·改行学it
xwz小王子20 分钟前
UniBYD:超越人类示教模仿的跨实体机器人操作学习统一框架
学习·算法·机器人·跨实体
liulilittle21 分钟前
moodycamel::ConcurrentQueue 清空队列的方法论
开发语言·c++
代码游侠26 分钟前
应用——Linux进程通信与信号处理
linux·运维·服务器·笔记·学习·信号处理
AI视觉网奇36 分钟前
Ue5 端上 搭建笔记
笔记·ue5
跨境卫士苏苏37 分钟前
突围新品广告泥潭:亚马逊广告底层逻辑大重构
大数据·人工智能·算法·重构·亚马逊·防关联