C++算法笔记


 

 

基础语法与环境配置

万能竞赛模板

 

 

输入输出基础

常见存储思维转换:

 

数据类型转换与判断

操作类型方法
char --> intint num = c -'0';
int --> charchar c = num +'0';
int,llong --> stringstring str = to_string(num);
string --> intint num = stoi(str)
string --> long longlong long num_ll = stoll(str)
大小写转换toupper(c), tolower(c)
数据类型判断isdigit(c), isalpha(c)

 

数学函数

常用内置函数
模板函数
  1. is_prime ( 素数 )

  2. Factorial ( 阶乘 )

  3. GCD,LCM ( 辗转相除法 )

  4. (AB)%MOD ( 快速幂 )

技巧结论
  1. 分数计算 H(n)=1+12+13+...+1n

  2. 约瑟夫环 (如:星期1~7循环).

    • 当多次循环处理结果不受循环次数影响时,可以进行2*n次循环来处理

      for (int i = 0; i < nums.size() * 2; i++) {}

  3. 两点间距 (x1x2)2+(y1y2)2

  4. 取模运算

  1. 三角形面积

    • 根据几何坐标(向量叉乘): Area=12|x1(y2y3)+x2(y3y1)+x3(y1y2)|,本质为|OA×OB|

    • 根据边长长度(海伦公式): Area=s(sa)(sb)(sc),s=a+b+c2

  2. 周期性边界处理

    • "轮流操作": 利用数学偏移思想,计算周期结束前的最后一步, 而不是下一个周期的第零步小L的游戏

位运算

数学符号表示运算符运算性质
AND&只有两个对应位都为 1 时才为 1
OR|只要两个对应位中有一个 1 时就为 1
NOT~0 变为 1, 1 变为 0
XOR,⊕^只有两个对应位不同时才为 1
   

 

序号公式表达结论说明
1a+b = a|b --> a&b=0推导
2a^b to min二进制为 1 的位数尽可能靠左,尽可能相同
3n & (n-1)判断 n 是否为 2 的整数幂次
4num & 1判断 num的最低位是否为1 (奇数)
50^a = a0与a的异或和为 a
6a^a^a^a^...^a^a^a = 0任意个相同数的异或和为 0
7a^a^a^a^...^a^a^B = B找出一堆相同数中不同的数
8a<<=b把a的二进制序列向左位移b位,即a2b
9x | y==y说明二进制序列中,x为1的位置y都为1
10num >> j & 1获取 num 的第 j 位编号 ( j: 0->n )
11a & ~(1 << b)将 a 的第 b 位设置为 0
12a | (1 << b)将 a 的第 b 位设置为 1
13a ^ (1 << b)将 a 的第 b 位取反
14a & (1 << b)获取 a 的第 b 位编号
15bool f = ((x ^ y) < 0);判断 x, y 是否异号
17G(i)=i(i>>1)自然二进制转格雷码 ( 相邻的两个数值在二进制表示中只有一位不同 ,相邻两项异或值之和最小 )
18Bi=GnGn1Gi格雷码转自然二进制

名词解释 ( 不完全中肯 )

  1. 乘法逆元 : 根据费马小定理,在模数 m 为质数,且 b 不是 m的倍数的情况下有:ab mod MOD=a×(bMOD2) mod MOD

  2. 长度为 n 的排列:由 1,2,,n​ 这 n 个整数、按任意顺序组成的数组(每个整数均恰好出现一次)。例如,{2,3,1,5,4}是一个长度为 5 的排列,而 {1,2,2}和 {1,3,4}都不是排列,因为前者存在重复元素,后者包含了超出范围的数。

  3. MEX: MEX 定义为没有出现在集合中的最小非负整数。例如,MEX(1,2,3)=0MEX(0,2,5)=1

  4. 数组的字典序比较: 从左到右逐个比较两个数组的元素。如果在某个位置上元素不同,比较这两个元素的大小,元素小的数组字典序也小。如果一直比较到其中一个数组结束,则长度较短的数组字典序更小。例如, {2,3,4,5} 的字典序小于 {2,4,3,5},也小于 {3,2,4,5}

  5. 连通块: 在网格中,若两个坐标间的曼哈顿距离为 1 则视为相邻。由数值相等的格子按该相邻关系划分的极大连通子集称为一个连通块。对于网格中的两个点(x1,x2)(x2,y2), 其曼哈顿距离为|x1x2|+|y1y2|

  6. 子序列: 从原序列中删除任意个(可以为零,也可以为全部)元素,且保持剩余元素相对顺序不变得到的新序列。例: {1,2,3,4,5}的子序列之一可以是 {2,5}


进阶语法

STL容器

迭代器

algorithm

string

增删改查
reverse ( 反转字符串 )
replace ( 替换字符 )
transform ( 转换大小写 )
substr ( 分割子串 )
remove+erase ( 去除所有空格 )

 

vector ( 动态数组 )

一维动态数组声明
增删
查找

 

stack (栈)

queue (队列)

list (双向链表)

 

priority_queue (优先队列)

set (集合)

set ( 所有元素在插入时自动被排序 )
multiset ( 允许容器中有重复的元素 )

 

unordered_set ( 仅用来去重 )

map (键值对)

map ( 用于key需要排序的情况 )
multimap ( 用于键key可重复的情况 )
unordered_map ( 不需要排序, 性能最好, 最常用 )

 

基础算法

二分法

利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止

前缀和/差分

模拟/枚举/倍增

严格遵循题目规则,不重不漏地 (or 有智慧地)穷举所有可能状态

  1. 建表查询: 将状态抽象化, 对于日期(仅12个固定值), 方位(上,下,左,右)等可枚举的量,直接建表

  2. 面向过程,结果编程: 保证所有过程都在问题之内,排演所有结果符合测试集要求

  3. 关于枚举: 考虑可能的情况, 枚举的元素, 枚举的空间范围(有优化空间), 枚举顺序

  4. 打表: 用于填空题, 暴力模拟题目要求, 人工寻找输出结果, 一般运行时间t>1s

贪心

鼠目寸光: 不从整体最优上加以考虑,而是始终做出在当前看来最好的选择,刷题!刷题!再刷题!

单调栈

要寻找任⼀个元素的右边或者左边第⼀个⽐⾃⼰⼤或者⼩的元素的位置,考虑单调栈

单调队列(滑动窗口)

维护元素单调性的队列就叫做单调队列,可用于获取窗口内最值(队首元素)


 

搜索

backtrack ( 回溯 )

核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止. 本质上是穷举, 效率并不高, 一般为指数级别, 可借助剪枝优化来提高效率.

DFS ( 深度优先搜索)

dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)

 

BFS ( 广度优先搜读 )

bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程


 

DP (动态规划)

将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算, 旧状态+决策=新状态

背包问题

背包问题
背包
物品
最大容量 v
价值 w
体积 v
每个物品的数量
只有一个
无数个
不同的物品数量不同
按组打包每组最多选一个
不选
选一个
01背包
不选
选几个
完全背包
多重背包
分组背包
混合背包

数据结构

二叉树

  1. 二叉树的遍历:

完全二叉树
  1. 节点编号的父子关系 ( 根节点编号为1 )

    • 左儿子: 2×i, 右儿子: 2×i+1, 父节点: i/2

    • 判断是否为左/右儿子:i % 2 == 0为左,i % 2 == 1为右

  2. 深度 ( Depth ) 与层 ( Level )关系 ( 根节点深度为 1 )

    • 节点 i 的的深度: d=log2i+1

      • 代码实现: ll dep = 0; while(i) { i >>= 1; dep++; }

      • 位运算优化: 64 - __builtin_clzll(i)(计算 i 的二进制前导零个数)

    • 第 d 层理想节点范围: [2d1,2d1]

    • 前 d 层总节点数: 2d1 ,第 d 层总节点数: 2d1

  3. 模板代码块

     

单调栈

训练情况

2026牛客寒假算法基础集训营

题目第一场 ( 7/12)第二场 ( 6/10)第三场 ( 7/10)第四场 ( 7/10)第五场 ( 6/10)第六场 ( 3/10)
A状压、枚举、概率、逆元简单思维枚举、简单数学签到、枚举二进制、二分、lowbit、注意力题贪心, 堆/优先队列, 数学、凸函数
B贪心、思维、数学排序、贪心暴力、概率、gcd前缀和签到组合数学, 预处理、隔板法
C贪心、脑筋急转弯搜索、二分构造、前缀和、Kadane构造、位运算、格雷码、分治几何、二分,线段覆盖线段树, 动态规划, 区间查询, 点更新
D二分、贪心树形 DP、数学网格 BFS、最短路数学、扩展欧几里得(EXGCD)、二分贪心、排序、双端队列最短路, Dijkstra, 网格图, 多源最短路
E枚举、贪心构造最小生成树、Kruskal状压DP、路径还原、打表贪心、二分,数据结构并查集, 离线处理, 排序, 动态连通性、逆向思维
F组合数学、链式并查集数论、位运算博弈、最短路、构造构造贪心、暴力,背包组合数学, 容斥原理, 期望, 快速幂, 逆元
G分类讨论、枚举、贪心数据结构、平衡树贪心、排序、前缀和数学、打表、质因数、搜索模拟前缀和, 双指针, 二分查找, 尺取法
H位运算、前缀和、优化 DP计数、容斥解析几何、三角形面积STL、暴力棋盘染色、贪心动态规划, 位运算, 可达性DP
I贪心、位运算、构造思维位运算 (XOR)、线性基概率、期望、诈骗二分、前缀和差分构造, 数论, 贪心、最大公约数
J最小生成树、线段树图论、BFS、最短路完全二叉树编号、位运算最短路、路径还原、模拟签到快速傅里叶变换(FFT)/快速数论变换(NTT), 字符串, 数学, 多项式、卷积
K签到、构造(未列出)(未列出)(未列出)(未列出)数学、周期性, 模运算
L签到、语法题    动态规划, 矩阵乘法, 组合数学、Kitamasa算法

优质题目归纳