第26次的云智计划总结
这是第 \(26\) 次的云智计划,这次考得不太好,只有 \(50 + 40 + 0 + 100 = 190\), 我们一个一个分析哈~~
第一道题是什么原因呢?因为算法是 \(O(nlog_n)\) , 由于 \(\sum n \le 10^6\) 时限是 \(1000ms\),这本来是分分钟就能过的,但是,它由于要用到 \(or\) 这个时间复杂度就多乘了一个 \(w\) ,这个 \(w\) 可是约等于 \(8\) 纳,然而,我又没有关同步流,就 \( TLE\) 得只剩 \(50 pts\) 了,我下次一定要关同步流了!虽然你关了同步流不一定能过,但是这分数肯定比不关同步流来的高呀,再说了,不会造极限数据吗?
第二题又是什么原因呢?那叫一个纯属手欠!为啥?我本来是放弃去打 \( T2\) 满分的,只想要 \(40\) 的,数组范围只开到了 \(400\) 可后来想到了 \(100\) 的做法,结果范围没改回来.... 下次这种小问题一定要好好检查!
第三题其实是大于 T4 ,大概有紫题的难度,不会,也没有看 T4 ,乱写了一个,但还是一分不得,还浪费了一个多小时。
第四道题真的不难,只有蓝减的难度,最后半个小时多一点就想出来了可能是因为以前见过吧....
总结一下,是因为 \(T3\) 磕的时间太久,\(T1\),\(T2\) 都没来得及去细细检查,本来能拿 \(300\) 的结果,不仅 \(T3\) 一分不得, \(T1, T2\) 还丢了 \(110\) 分,就算 \(T3AC\) 也补不回来。
这是通过 \(deepseek\) 的帮助列的比赛通用检查表:
信息学竞赛终极代码检查表
| 阶段 | 大类别 | 细分类别 | 具体检查项 | 注意事项/技术方案 | 完成 |
|---|---|---|---|---|---|
| Ⅰ. 编码规范 (5min) | 1.1 格式控制 | 缩进 | □ 统一4空格缩进(禁用Tab) | IDE设置:强制空格替代Tab | □ |
| 行宽 | □ 单行≤100字符 | 字符串常量允许120字符 | □ | ||
| 花括号 | □ Stroustrup风格:if(){ 换行对齐 |
禁止Allman风格(独占行) | □ | ||
| 1.2 命名规范 | 变量 | □ 小驼峰命名法(nodeCount) |
禁止拼音(shuzu) |
□ | |
| 常量 | □ 全大写+下划线(MAX_DEPTH=1000) |
宏定义也必须大写 | □ | ||
| 函数 | □ 动词开头+名词(calculateDiameter()) |
避免solve()等模糊命名 |
□ | ||
| 1.3 注释管理 | 函数头 | □ 注释参数含义/返回值/功能 | 示例:// @brief: DFS遍历树// @param u: 当前节点, fa: 父节点 |
□ | |
| 关键逻辑 | □ 复杂算法步骤注释 | 示例:// 此处使用Manacher算法扩展中心 |
□ | ||
| 调试注释 | □ 删除所有//DEBUG标记代码 |
保留条件编译块:#ifdef LOCAL_DEBUG |
□ | ||
| Ⅱ. 逻辑健壮性 (15min) | 2.1 数据类型 | 整型选择 | □ 1e5 * 1e5用long long |
宏全局覆盖:#define int long long |
□ |
| 浮点处理 | □ 避免除法转浮点 | 必须时用整数分母:a/(double)b → a*1.0/b |
□ | ||
| 精度控制 | □ 比较用abs(a-b)<EPS |
定义const double EPS=1e-9 |
□ | ||
| 2.2 内存管理 | 静态数组 | □ int arr[100005] → int arr[100010] |
+5~10冗余 | □ | |
| 动态容器 | □ vector.reserve(n+5) |
减少扩容次数 | □ | ||
| 栈溢出 | □ DFS递归层>1000时改非递归 | Windows默认栈1MB | □ | ||
| 2.3 边界检查 | 输入边界 | □ n=0, n=1, n=1e5 |
数据生成器必含n=0 |
□ | |
| 循环边界 | □ for(int i=0;i<n;)是否含等号 |
画5元素示意图验证 | □ | ||
| 越界访问 | □ dp[i][j]中j可能超界? |
检查二维数组第二维大小 | □ | ||
| 2.4 性能优化 | STL传递 | □ 函数参数用const vector<int>& |
禁止vector<int>值传递 |
□ | |
| 冗余拷贝 | □ 删除临时容器tmp=vec |
用swap移动语义 |
□ | ||
| 复杂度匹配 | □ n=1e5时O(n²) → TLE |
检查双重循环层数 | □ | ||
| Ⅲ. 调试验证 (10min) | 3.1 对拍系统 | 暴力程序 | □ bf.cpp确保正确性 |
哪怕写O(n!)爆搜也要实现 | □ |
| 数据生成器 | □ 覆盖:升序/降序/全0/全负数/大数/RBT退化链 | 树图结构用链式/星形/菊花图 | □ | ||
| 脚本监控 | □ Windows: @echo off循环检测□ Linux: while ./gen | ./std; do; done |
输出错误数据时暂停 | □ | ||
| 3.2 特殊测试 | 极限数据 | □ n=100000测TLE□ int_max=2147483647测溢出 |
计时命令:time ./std < data.in |
□ | |
| 浮点特测 | □ 1e18+1-1e18==0? 验证大浮点精度损失 |
改用整数运算规避 | □ | ||
| 3.3 静态查错 | 符号检查 | □ =→== □ |→| |
重点查if/while条件 | □ | |
| 初始化验证 | □ 多组数据全局变量重置 | 使用初始化函数:void init(){ memset(head,-1,sizeof(head)); } |
□ | ||
| Ⅳ. 提交终检 (5min) | 4.1 I/O安全 | 文件重定向 | □ 注释freopen("in.txt","r",stdin) |
保留条件编译:#ifndef ONLINE_JUDGE |
□ |
| 读写同步 | □ 添加ios::sync_with_stdio(false) |
必须搭配cin.tie(0) |
□ | ||
| 4.2 输出规范 | 行末空格 | □ 最后一行无换行? □ 用 i<n-1?" ":"\n"控制空格 |
Linux换行\n,禁止\r\n |
□ | |
| 精度输出 | □ printf("%.6f",ans)保持6位小数 |
C++默认四舍五入 | □ | ||
| 4.3 编译安全 | 头文件 | □ 检查#include<bits/extc++.h>是否允许 |
备用标准头文件列表 | □ | |
| 编译命令 | □ 本地测试与提交环境一致:g++ -std=c++17 -O2 |
禁止开-D_GLIBCXX_DEBUG |
□ | ||
| 禁用标识符 | □ 筛查:x1,y1,time,pipe,next |
用nxt,tm,pnt替代 |
□ | ||
| Ⅴ. 致命错误专项 | 5.1 内存越界 | 数组索引 | □ 访问[0]或[n-1]时i-1变负?□ 树链剖分 son[u]未判空? |
防御性判断:if(i>=0 && i<n) |
□ |
| 5.2 整型溢出 | 乘积溢出 | □ a*b可能>1e18?→ (ll)a*b |
中间变量强制转型 | □ | |
| 位运算 | □ 1<<60 → 用1LL<<60 |
移位超32位必须long long | □ | ||
| 5.3 多线程问题 | 静态变量 | □ 多组数据中static int cnt残留值 |
全局变量必须显式重置 | □ | |
| 随机种子 | □ srand(time(0))导致对拍失败 |
固定种子:srand(42) |
□ | ||
| 5.4 输出崩溃 | 缓冲区未刷新 | □ printf后无fflush(stdout)? |
交互题必须刷新 | □ | |
| 无效指针 | □ 访问已释放内存(C风格链表) | STL容器替代手工内存管理 | □ |
超高频错误专项检查
| 错误类型 | 检查方案 | 应急方案 | 案例 |
|---|---|---|---|
| long long遗漏 | 查找[^l]long\s+int |
全局替换:sed -i 's/int main/long long main/g' |
ans未改LL,WA在99%测试点 |
| 数组开小 | 对拍满数据n=100000观察是否RE |
定义const int MAXN=1e5+100; |
vector未reserve导致随机崩溃 |
| 多组数据残留 | 构造连续2组相同输入比对输出差异 | 重写初始化函数clear() |
邻接表head数组未置-1 |
| 浮点截断错误 | printf("%.0f", 5.0)→5 vs (int)round(5.0) |
统一转整数:(int)(ans+0.5) |
floor(0.29 * 100)=28 |
| 迭代器失效 | 遍历中修改vector/map |
用临时容器存储变更 | for(auto it:mp) mp.erase(it);崩 |
| 无解分支遗漏 | 构造无解数据测试 | 函数末尾加throw或assert(0) |
SPJ报"No Solution" |
竞赛急救包代码片段
// 内存检测(仅调试用,提交前注释掉!)
#define _GLIBCXX_DEBUG
// 栈空间扩展(64MB)
#include <sys/resource.h>
void init_stack() {
const rlim_t kStackSize = 64 * 1024 * 1024;
struct rlimit rl;
getrlimit(RLIMIT_STACK, &rl);
if (rl.rlim_cur < kStackSize) {
rl.rlim_cur = kStackSize;
setrlimit(RLIMIT_STACK, &rl);
}
}
// 多组数据初始化宏
#define reset_all() do{ \
memset(head, -1, sizeof(head)); \
edge_cnt = 0; \
} while(0)

浙公网安备 33010602011771号