递归枚举:二叉树递归版 vs for 多叉版
同一个问题「从 $1 \sim n$ 里选 $m$ 个数」,有两种最常见的递归写法: 二叉树递归版:每个数字二选一(选 / 不选),按数字分层 for 多叉版:每层填一个位置,按已选个数分层 两种都是 DFS、都是前序,但遍历的搜索树根本不是同一棵。 一、问题从 $1 \sim n$ 中选出 $m$ 个数,按字典序输出所有组合。 以 $n = 3,\ m = 2$ 为例,答案只有三组: 1{1,2} {1,3} {2,3} 二、写法 A:二叉树递归(选 / 不选)2.1 核心思想每一层对应一个数字,每个节点只有两个分支:拿它,或者不拿它。 12345678910111213int n, m;vector<int> a;void calc(int x) { // 正在决定数字 x 选不选 if ((int)a.size() + (n - x + 1) < m) return; // 剪枝:后面的全选也凑不满 if ((int)a.s...
算法竞赛常用变量/函数简写
手速就是分数。下面是算法竞赛里约定俗成的简写,统一使用能省下大量敲键盘的时间。 基础 calc = calculate:计算、递归求解 sol = solve:主求解函数 chk = check:校验、判断合法性 qry = query:查询 upd = update:更新 cnt = count:计数器 res = result:答案、结果 ans = answer:最终答案(最常用) tmp = temporary:临时变量 lst = last:上一个、最后 nxt = next:下一个 pre = previous:前驱 cur = current:当前 tot = total:总和、总数量 图论 u / v:节点(约定俗成,不是缩写) fa = father:父节点(并查集、树) dep = depth:深度 dis = distance:距离 vis = visit:访问标记数组 edg = edge:边 to:边指向的点 siz = size:子树大小 rt = root:根 dfn:dfs 序(固定缩写) low:tarjan 里 low 值(固定缩写) ...
C++ type_traits:编译期类型查询与类型变换
type_traits 是编译期类型反射工具库,头文件 <type_traits>。 作用:编译期查询、修改类型属性,所有逻辑在编译阶段完成,运行时不产生任何指令。大量配合模板、SFINAE、concept、万能转发使用。 分成两大类:类型查询(traits 萃取) 和 类型变换(修改类型) 一、类型查询:is_xxx 系列C++17 之后推荐用 _v 变量模板,直接得到 bool 编译期常量,写法 std::is_xxx_v<T>。 1.1 基础类别判断1234567891011std::is_void_v<T> // 是否 voidstd::is_integral_v<T> // 是否整型 int/long/char 等std::is_floating_point_v<T> // 是否浮点 float/doublestd::is_arithmetic_v<T> // 算术类型 = 整型 + 浮点std::...
C++ 六大特殊成员函数:= default / = delete、平凡可复制与标准布局
只针对六大特殊成员函数:默认构造、析构、拷贝构造、拷贝赋值、移动构造、移动赋值。 它们可以在函数声明末尾加 = default; 或 = delete; 来接管编译器的行为。 一、= default:显式默认告诉编译器:请你帮我生成这个函数的默认版本,和编译器隐式自动生成的一模一样。 1.1 什么时候用① 你写了别的构造函数,编译器本来不再生成默认构造,可以手动把它召唤回来: 1234struct A { A(int a) {} A() = default; // 强制让编译器生成无参默认构造}; ② 把函数定义放到类外,依然要求编译器生成默认实现: 1234struct A { A();};A::A() = default; // 定义写在类外,实现仍由编译器生成 ③ 控制特殊成员函数的属性(constexpr、noexcept)。 1.2 特点 函数存在、可调用 函数体由编译器自动生成,是空默认逻辑 默认版本写在类内声明处时,还是隐式的 inline 二、= delete:删除函数告...
C++ constexpr:让计算发生在"编译期"
constexpr = 编译期可求值。标记变量 / 函数 / 构造函数,告诉编译器:这个东西能在编译阶段就算出结果,而不是等到程序运行时才算。 区分:const 只是"只读",不一定编译期求值;constexpr 强调"可以编译期计算"。 一、const vs constexpr:最容易混的一对 关键字 含义 求值时机 const 只读,不能改 可以运行时求值 constexpr 编译期可计算 优先编译期求值,也支持运行调用 简单记忆: const:不能写(只读); constexpr:能在编译期算。 12constexpr double pi = 3.1415926; // 编译期常量const double pi2 = 3.1415926; // 只读常量,语义不同 二、constexpr 变量12constexpr int val = 2 * 2 * 2 * 2; // 编译期直接算出 16,运行时不算int arr[val]; ...
C++ decltype
decltype 是 C++11 引入的关键字:推导表达式的类型,编译期就确定,不执行表达式。 1decltype(表达式) // 拿到表达式对应的类型 一句话:decltype 问编译器"这个表达式是什么类型",编译器如实回答。和 auto 看上去很像,但保留引用 / 顶层 const,比 auto 更精确。 一、四条基础规则decltype(expr) 的推导结果取决于括号内表达式的类型 + 值类别: 表达式 expr 的形态 decltype(expr) 推导结果 变量名(裸的标识符) 变量声明时的类型(含引用) 左值表达式(非变量名) T&(左值引用) 纯右值 T(普通类型) 将亡值(std::move(x) 这类) T&&(右值引用) 简单记:只有"裸的变量名"按字面理解,其他表达式都按值类别加引用。 二、decltype(x) vs decltype((x)):最经典的坑1234int x = 10;decltype(x) a; /...
一些信息和规划
这一篇是个人向的时间线 + 资源汇总,包含关键考试节点、考研 / 留学路线、英语递进、竞赛优先级、签证对比。信息会随时间更新,仅供参考。 一、一些信息和规划 基准:你现在:2026级本科新生(大一) 本科校内必修类 大学英语四级(CET4) 可报考时间:大一下学期(6月)、大二上(12月),大部分学校大一上不让报 合格线:425;目标:≥500,对保研、复试、留学文书加分 大学英语六级(CET6) 报考前提:四级≥425;考试:每年6/12月 目标:≥480;≥550含金量更高,很多国内考研复试、夏令营看六级 专业课期末:C语言/C++、离散数学、数据结构、操作系统、计算机网络、数据库、算法(考研核心专业课) 计算机二级(非强制,可选):C/C++,低年级拿,简历加分 竞赛&能力认证(对你CS+生物交叉方向很有用,不是必须考试) 蓝桥杯:每年4月省赛,5月国赛;C++算法,考研复试加分 全国大学生数学建模:每年9月;生信/计算生物学非常看重这个,跨学科项目 PAT计算机能力测试(浙大):3/9/12月,计算机考研/求职加分 软考(可选):软件设计师,每年...
位移运算:<<、>>、算术右移 vs 逻辑右移
C/C++ 里所有位运算(移位 >> <<、& | ^ ~),全部是对【补码】进行操作,不是原码。计算机内存里整数永远以补码形式存放,位运算直接操作内存里的二进制比特(补码)。 想要搞懂"补码为什么是补码",可以先看《原码、反码、补码:为什么计算机只用"加法"就能做减法》那一篇。 一、左移 <<向左移动一位,移出去的位舍去,右边补 0。 12int a = 26;int b = a << 1; // 52 直观理解:a << n 相当于 a * 2^n(在 不溢出的前提下)。 1.1 负数左移也要算补码12-26 的原码:10011010-26 的补码:11100110 -26 << 1: 12补码左移:11100110 → 11001100(最高位的 1 移出去,最低位补 0) 把 11001100 当补码读回十进制:−52。 左移没有"算术 / 逻辑"之分——不管正负数,移出去的位都丢,右边一律补 0。 二、...
STM32 TIM 定时器:让 CPU 解放双手
定时器(TIM)是 STM32 里最常用、最强大的外设之一。它能对输入的时钟进行计数,并在数值达到设定值时触发中断——本质就是一个硬件计数器。 这一篇只整理通用定时器最常用的部分:基本定时、PWM 输出(如果你想补全这一节,可以写在下面留白处)。 一、定时器能干什么 用途 说明 定时中断 每隔固定时间进一次中断,做周期性任务(LED 闪烁、按键扫描) 输出比较 / PWM 输出可变占空比的方波,驱动电机、舵机、LED 调光 输入捕获 测量外部信号的频率 / 占空比 / 脉宽 编码器接口 读取旋转编码器的旋转方向与速度 二、几个核心概念2.1 时钟源定时器由内部时钟(CK_INT) 或外部信号驱动。对应的预分频器把时钟频率降到"想要的计数频率"。 2.2 三个关键寄存器(概念) 寄存器 / 参数 作用 PSC(预分频器 Prescaler) 把输入时钟先除一下:CK_CNT = CK_PSC / (PSC + 1) CNT(计数器 Counter) 当前计数值,从 0 累加到 ARR 就触发事件 A...
C++ std::sort:从基础排序到自定义比较函数
头文件:<algorithm> 一句话:对 [first, last) 左闭右开区间排序。 C++11 之后标准规定:sort 是不稳定排序,实现一般是 introsort(内省排序 = 快速排序 + 堆排序 + 插入排序三者结合)。时间复杂度:$O(N \log N)$。 一、函数原型1234567// 版本 1:默认升序,用 < 比较template< class RandomIt >void sort( RandomIt first, RandomIt last );// 版本 2:自定义比较函数 cmptemplate< class RandomIt, class Compare >void sort( RandomIt first, RandomIt last, Compare comp ); ⚠️ 区间是 [first, last)——包含 first,不包含 last。数组/vector 排序一般写 sort(a.begin(), a.end())。 二、基础示例123456789101112#include <...