蓝桥杯的必背模板
距离蓝桥杯 B 组省赛仅剩一周时间紧迫建议你放弃死磕难题主攻“默写级”高频模板。B 组省赛的核心逻辑是用正确的模板快速拿下基础分而不是在现场推导算法。这份清单按“性价比”排序请优先掌握前 6 项。建议每天花 30 分钟手敲一遍这些代码形成肌肉记忆。 考前必背模板B组核心向1. 万能头与宏定义防爆零作用避免手滑写错头文件统一处理 long long 溢出问题。#include bits/stdc.h using namespace std; typedef long long ll; // 必写防止大数据爆int const int INF 0x3f3f3f3f; const int N 1e5 10; // 根据题目调整 int main() { // 关闭同步流加速 cin/cout如果用了printf就别用 ios::sync_with_stdio(false); cin.tie(0); // 你的代码 return 0; }2. 二分查找整数/实数版场景求最大值最小、最小值最大或有序查找。B组必考。// 整数二分找满足条件的最大值 int l 0, r 1e9; while (l r) { int mid (l r 1) 1; // 注意1防死循环 if (check(mid)) l mid; // check()需自己实现 else r mid - 1; } cout l endl; // 实数二分保留k位小数循环100次足够精确 double l 0, r 1e9; for (int i 0; i 100; i) { double mid (l r) / 2; if (check(mid)) r mid; else l mid; } printf(%.2f\n, l); // 输出时控制精度3. 前缀和与差分区间处理神器场景频繁求区间和、区间加减。// 一维前缀和 ll s[N]; for (int i 1; i n; i) { cin a[i]; s[i] s[i-1] a[i]; } // 查询 [l, r] 和ans s[r] - s[l-1]; // 一维差分区间加 ll d[N]; // 初始为0 void add(int l, int r, int c) { d[l] c; d[r1] - c; } // 操作后求原数组for (int i 1; i n; i) d[i] d[i-1];4. 动态规划01背包/完全背包场景资源分配、选数问题。// 01背包每个物品选一次容量倒序 int dp[N] {0}; for (int i 1; i n; i) { for (int j V; j v[i]; j--) { // 倒序 dp[j] max(dp[j], dp[j - v[i]] w[i]); } } // 完全背包物品无限容量正序 for (int i 1; i n; i) { for (int j v[i]; j V; j) { // 正序 dp[j] max(dp[j], dp[j - v[i]] w[i]); } }5. 搜索DFS/BFS 迷宫模板场景全排列、迷宫最短路。// DFS 全排列无重复元素 vectorint path; vectorbool vis(n1, false); void dfs(int u) { if (u n) { // 输出排列 return; } for (int i 1; i n; i) { if (!vis[i]) { vis[i] true; path.push_back(i); dfs(u 1); path.pop_back(); vis[i] false; } } } // BFS 迷宫最短路四方向 int dx[] {0, 0, 1, -1}, dy[] {1, -1, 0, 0}; int dist[100][100] {0}; // 记录步数初始-1表示未访问 queuepairint, int q; q.push({sx, sy}); dist[sx][sy] 0; while (!q.empty()) { auto [x, y] q.front(); q.pop(); for (int i 0; i 4; i) { int nx x dx[i], ny y dy[i]; if (nx 0 nx n ny 0 ny m !vis[nx][ny] g[nx][ny] 0) { dist[nx][ny] dist[x][y] 1; q.push({nx, ny}); vis[nx][ny] true; } } }6. 数学工具GCD/快速幂场景约分、大数取模。// 最大公约数 最小公倍数 int gcd(int a, int b) { return b 0 ? a : gcd(b, a % b); } int lcm(int a, int b) { return a / gcd(a, b) * b; // 先除后乘防溢出 } // 快速幂 (a^b % mod) ll qpow(ll a, ll b, ll mod) { ll res 1; while (b) { if (b 1) res res * a % mod; a a * a % mod; b 1; } return res; } 进阶提分项时间充裕再看如果上述模板已滚瓜烂熟可以补充以下两个高频结构7. 并查集连通性判断int fa[N]; void init() { for (int i 1; i n; i) fa[i] i; } int find(int x) { return fa[x] x ? x : fa[x] find(fa[x]); } void merge(int a, int b) { a find(a), b find(b); if (a ! b) fa[a] b; }8. 结构体排序多关键字struct Node { int score, id; }; bool cmp(const Node a, const Node b) { if (a.score b.score) return a.id b.id; // 成绩相同按id升序 return a.score b.score; // 成绩降序 } sort(v.begin(), v.end(), cmp); 最后一周冲刺策略抄写为主不要只看不写。每天把二分、前缀和、背包、DFS四个模板默写一遍。真题驱动找近 3 年 B 组省赛真题只做前 5 道简单/中等题套用上述模板。防错检查数组大小是否开了N 1e510级别int是否全改成了long longB组常考大数二分边界l和r的初始值是否合理稳住基础模板省二/省一希望很大。祝你顺利