【GESP/CSP考点精讲】GESP五级 / CSP-J 必背:二分查找为什么会死循环?mid=(l+r)/2 与 (l+r+1)/2 终极判定指南
算法竞赛圈流传着一句经典的自嘲:“二分查找思路只需十秒钟,调试边界死循环却要两小时!”为什么明明只是在一个有序数组里折半找数,有的时候写 mid = (l + r) / 2 顺畅通关,有的时候把 r = mid 换成 l = mid,程序就瞬间卡死在 while (l...
一个中年人的技术自留地。记录学习 C++、GESP/NOI 信奥算法、Java 架构演进与 Python 的心得体会。 始于 2012,现已积累 1022 篇独立技术笔记。
GESP/CSP 学习公众号本置顶将汇总本站发布的GESP认证考试相关资源,并进行了分类整理,不定期更新。 GESP资源专项站,Wiki式阅读,专项学习更友好: GESP资源专项站 所有源代码详见C++ 学习项目:yummy-code(https://github.com/lihongzheshu...
算法竞赛圈流传着一句经典的自嘲:“二分查找思路只需十秒钟,调试边界死循环却要两小时!”为什么明明只是在一个有序数组里折半找数,有的时候写 mid = (l + r) / 2 顺畅通关,有的时候把 r = mid 换成 l = mid,程序就瞬间卡死在 while (l...
为什么在工程实践与算法竞赛中,快速排序(Quick Sort) 无需像归并排序那样额外开辟长度为 n 的辅助数组 tmp[],就能以极小的常数因子跑出 O(n log n) 的飞快速度,稳坐“通用原地排序之王”的宝座;可一旦某个同学手写快排时图省事固定挑选区间首元素 a...
当题目给出的数据规模从 n = 1000 跃升到 n = 10^5 时,无论是冒泡排序、直接插入排序,还是用双重 for 循环暴力枚举统计“逆序对”,运算次数都会瞬间飙升至 (n(n-1)/2) ≈ 5 × 10^9 次,在 1 秒时限面前毫无悬念地触发 TLE(运行超...
为什么只给纯整数数组 [5, 3, 5, 2] 排个序,教材和真题却总要喋喋不休地追问“两个 5 排完之后谁在谁前面”?两个一模一样的数字 5 颠倒了顺序,表面上看结果不还是 [2, 3, 5, 5] 吗?然而一旦进入真实教务系统或信奥结构体排序场景——比如教务老师先将...
为什么一段只有 5 行的斐波那契递归代码 return fib(n - 1) + fib(n - 2);,当输入 n = 10 时瞬间出解,一旦输入 n = 45 就会触发超过 22 亿次函数调用,把评测机死死卡在 TLE(运行超时)?更神奇的是,为什么在不改变递归主体...
为什么在考场上遇到一句看似简单的 return f(n - 1) + f(n - 2);,有些同学在脑子里绕了三层就彻底“死机”,完全算不清函数到底被调用了多少次?为什么仅仅把 cout << n; 放在递归调用语句的前面和后面,打印出来的数字顺序就会发生天翻地覆的“逆...
为什么在考场上拿到一道题,有经验的高手还没读完题面,仅仅扫了一眼最下方的“数据范围:对于 100% 的数据,1 ≤ N ≤ 10^5”,就能在 3 秒内断言:“这题绝对不能写双重循环冒泡排序,必须用 O(N log N) 的归并/快排或二分查找”?为什么你的代码逻辑在本...
为什么每年 CSP-J/S 第二轮复赛成绩公布后,总有一大批平时模拟赛能拿二三百高分的选手,打开成绩单却看到刺眼的 4 题全 0 分(爆零)?为什么你的算法逻辑完美无缺、本地小样例全过,仅仅因为在交卷前忘记删掉 // freopen("apple.in", "r", s...
为什么在 C++ 中定义一个包含 char c1; int x; char c2; 三个成员的结构体(1 + 4 + 1 = 6 字节),用 sizeof 测出来的内存体积却是 12 字节,而仅仅把 int x 挪到第一行变成 int x; char c1; char...
为什么在 C++ 中写下 char a[] = "GESP"; 和 char b[] = {'G', 'E', 'S', 'P'};,明明看起来都是 4 个字母,用 sizeof(a) 测出来是 5,而 sizeof(b) 却是 4?更可怕的是,如果对 b 调用 str...
为什么刚学函数的同学写下 void myswap(int x, int y) { int t = x; x = y; y = t; },在 myswap 函数内部明明看到 x 和 y 的值已经互换成功,可一旦退回 main 函数打印实参 a 和 b,它们却纹丝不动?为什...
为什么在 C++ 中定义一个整型指针 int p = &a[0];(假设起始地址为 0x1000),当我们对它执行看似最简单的加法 p = p + 1; 时,指针里存放的内存地址并没有变成 0x1001,而是直接跳到了 0x1004?更让人不可思议的是,如果另一个指针...
为什么我们在纸上画二维数组 int a[3][4]; 时,它明明是一张 3 行 4 列的二维网格表,但在计算机物理内存(RAM)中,它却被压扁成了一条头尾相接的一维直线?更让人困惑的是,为什么在声明或传参二维数组时,C++ 编译器允许省略第一维行数(如 int a[][...
为什么在 C++ 语言中声明一个长度为 10 的一维数组 int a[10];,合法的下标范围却是 a[0] 到 a[9],一旦访问 a[10] 就会引发难以排查的 Bug?更让人百思不得其解的是,为什么当我们在代码中不小心写出 a[10] = 999; 甚至 a[-1...
为什么在复赛考场上写出一行 int a[2000005];,如果把它放在 main() 函数内部,程序刚一运行就会直接崩溃报错 Segmentation fault(段错误 / 爆栈 RE),而只要把它挪到 main() 函数外部,不仅瞬间转危为安,而且连 memset...
为什么在 C++ 中执行完 int a = 0, b = 5; bool res = (a != 0) && (++b 5); 之后,打印出来的 b 居然还是 5 而不是 6?为什么在复合表达式 (++x == 2) (++y == 2) && (++z == 2) 中...
为什么在 C++ 中计算整数除法 -5 / 2 得到的结果是 -2,而将 -5 右移一位 -5 1 算出来的却是 -3?为什么在统计一个大整数的二进制表示中有多少个 1、或者判断一个数是不是 2 的正整数次幂时,高手从来不用 while (n 0) { cnt += n...
CSP-J 2026 第二轮入门组压轴第四题《纸牌游戏》(luogu-P17830),要求对全部 n 个后缀游戏局分别模拟“遇到相同点数则收走该牌及其右侧所有牌”的过程,并统计每种点数最终留在桌面上的局数。本题是一道极具思维美感的不变量洞察 + 线性状态递推(DP)好题...
CSP-J 2026 第二轮入门组第三题《按位与》(luogu-P17829),要求从 n 个非负整数中选出恰好 m 个数,使它们的二进制按位与(&)结果最大。本题是经典的二进制按位从高到低贪心试填模型,思路清晰、代码极其精炼,适合 GESP 五级与六级考生练习,难度...
CSP-J 2026 第二轮入门组第二题《回文串》(luogu-P17828),给出由 n 段连续相同字符组成的超长字符串(总长可达 2× 10^14),要求计算将其修改为回文串所需的最少字符修改次数。本题核心考查游程编码(RLE)压缩表示下的双指针同步消去技巧,适合...