Fork me on GitHub

第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 * 1e5long 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=1e5O(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);
无解分支遗漏 构造无解数据测试 函数末尾加throwassert(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)

在这里更新一个易错点哈,就是有些比赛的大样例的文件名和题目的文件名是不一样的!(比如说首字母的大小写),今天就因为这个原因 \(330->100\)

posted @ 2025-06-07 12:52  tony0530  阅读(16)  评论(0)    收藏  举报