、
记录一些挂过分的地方
挂分点
- 完全想通之后再写代码,不要感觉有思路就着急写代码
- 最后检查一下数组大小有没有开小(图论,值域,字符串)
- 输出单词啥的直接复制
- 把动规式子写下来
- 仔细算空间大小,看看用了多少
- 最后检查容易写混的字母有没有写错,比如类似行列的
r,c 与 m,n 和 p,q
- 推一大堆式子的时候不要跳步,把每一步都写在草稿纸上,不要相信自己的脑子。
- 不要信卡常,相信现在的程序可以做到正解跑飞快,紧贴时限一定是写错了
- 在使用到不可避免的名称相近的变量时要减慢速度慢慢写,任何一个地方。
freopen("xx1.in")
- 在做完的时候一定要检查如果全部开 long long 会不会 MLE
- 仔细考虑动规边界是否符合定义,不要多设和少设。
- 使用
memset 时注意sizeof的值有没有写混,如memset(vs,false,sizeof(vis)
- 如果已经写了暴力且数据好造且时间充足不妨写个对拍,否则挂掉的话就会很难受
- 写最短路时如果有多个可能性(比如取反一些值啥的),那么距离数组和访问数组不能只开 \(d_u\),要开成 \(d_{u,0/1}\) 之类的。
- 形如
if(i) 或 for(int i=20;i;--i) 是循环到大于 \(0\)
- 如果用cin,cout一定要关同步
- 如果卡常的话能不开 long long 就不开
- cout输出ceil啥的看起来是整数的要强转整形,否则会科学计数法输出
- \(2^{60}\approx 1.15\times10^{18}>10^{18}\)
- 写暴力的时候数组开成和暴力范围一样的大小,否则可能会出现
memset 时间复杂度假掉的情况
- 在数据过大(超 int)时不要用 cmath 里的东西,如
sqrt 等,会炸精度,自己写二分
- 多维数组尝试不要来回换维,常数有巨大提升
- dijkstra等最短路与边数有关,如果 n很小但是m很大的话换成floyd更好
- 浮点运算先乘后除,防止精度问题。
- 线段树注意 push_up
- 链式前向星遍历不要写成
i=head[i]
- 二分或其他mid不要手滑写成
(l+1)/2或(1+r)/2
- 按秩合并并查集复杂度是 \(O(\log n)\) 的。
lower_bound(se.begin(),se.end()) 是 \(O(n\log n)\) 的。
- 在有 \(0\) 的情况下不可以使用前缀积。
Trick
- \(a \mod b\) 转成 \(a-b\lfloor \frac{a}{b}\rfloor\) 可以用整除分块处理。
- 容斥如果正着不好做可以考虑补集
- 两个序列判断它们是否在无限拼接后相遇只用看它们对两个序列长度的最大公约数取模是否相同即可。
- 在推式子之前如果不好推先看看有没有规律,有的时候找到规律再去证明更简单。
- 策略上不管怎样将T1做出来,否则的话就想T1做不出来1=一定没戏。做出T1后先将T3 T4的暴力拿满,这样万一卡T2了心理不会很慌。
- 对于某种求存在的方案数可以转成全部情况减钦定不存在
- 第一题和第二题难度大概是差不多的,所以第一题可能比第二题难,第一题想0.5h后如果没有思路那么就先去看第二题,并且不断暗示自己第一题做不出来的大部分时候别人也做不出来。
- 树上两点无环路径为 \(1\)。
- 代码非常耗时,有思路就先继续想,不要会一个暴力就写。
- 注意思维深度,如果始终没有想出来那么就要学会放弃自己之前的思路。大概就是最开始的时候就想歪了。
- 在想到了一个看起来很恶心但是可做的时候不如再稍微想一想能不能做/有没有简便做法。告诉自己在联赛不会出一些太恶心的东西的,说不定再化一化就出来了。
- 大样例只有一个或没有时必须检查代码。
- 在知道比正解多一个 \(\log\) 时要先预估一下常数再去写代码。
- 想题之前先玩玩样例防止想偏。
- 对于单一的加/删元素如果难做可以考虑时光倒流改成删/加来思考
posted @
2025-10-24 15:16
tanghg
阅读(
40)
评论()
收藏
举报