一语总结
一语总结
真心建议把找到的一些性质和做法以文字形式写下来,当掉不过样例的时候一个一个检查其正确性。”P9169 [省选联考 2023] 过河卒“用DFS将环当作平局是错误的因为这可能只是一个不优的必胜/必败局面,正确的做法是老实建图按拓扑序跑BFS。就这个结论的错误害我虚空调题1h。
一个较为正确的程序可以获得较高的分数甚至AC,因为错误的代码在一些特殊性质下可能正确,并且难以被随机数据卡掉,并且出题人想不出来。
“P10220 [省选联考 2024] 迷宫守卫” 中过了所有样例但有很多情况没有考虑,对拍一拍就错的代码:

稍微改动了一下但还是一拍就错的代码:

进一步改动后极限数据拍了 \(648\) 组拍不出来,小样例在第 \(5820\) 组拍出错误,中样例在第 \(20\) 组拍出错误的代码。

当遇到一个十分奇怪的数列,有大量的合数,那么可以考虑猜组合数,比如数列 \(1,2,6,20,70,252,\cdots\),就不难猜出通项公式是 \(a_n={2n\choose n}\)。\(\colorbox{Black}{其实是因为我记得}{4\choose 2}=6,20=4\times 5 \colorbox{black}{让我发现 }20={6\choose 3}\)
出处:P3978 [TJOI2015] 概率论
-D_GLIBCXX_DEBUG 可以帮你调试一些本来会RE但本题由于神奇原因没有RE的行为。但也可能让一些没有问题的地方报RE。
记得一上来先#define int long long 不然后面忘了就死翘翘。
注意,如果状态的转移不形如 DAG ,则一定要用最短路而不是直接上 dp,可以先用最短路预处理后再dp。
比如 2025洛谷省选模拟赛D2T3,其”编辑距离“给了 \(a\to b\) 的代价,但 \(a\to x\to y\to z\to b\) 的代价可能优于直接 \(a\to b\) ,这就需要跑Floyed预处理。
“WQS二分”与“容斥”可以减少掉dp状态中“恰好”的限制,前者是限制个数恰好为 \(k\),后者是选取集合恰好为 \(S\)。
暴力不能用memset!!
想到正解后,可以再想想有没有什么代码实现更简洁的做法
(类)莫队更新一定要先add后del,不然减成空集就非法了。WA AC
斜率优化算Slope会被卡精度,即使本身已是 double 运算,也需改为乘法。谴责没有spj的小数题。WA AC
下界等于0的特判R185887796
上界炸long long的特判R184737815
树上根节点的特判R186097493
对自环的特判R187506810R187507250
void函数写成int类型且没有returnR188011230R188027191
合并两个Sub时共用函数导致时间复杂度错误
快速幂没有考虑p=1的情况R146265917R191756742
函数传string会拷贝R116934857R116937673
动态开店线段树多开一倍R197433577R197019193
对应域太小导致Hash冲突R197019466R197019532
cache missR198719956R198720030
记录详情 - 洛谷 | 计算机科学教育新生态 排序没有保证严格弱序
如果一道题目暴力即正解——无法对拍:一定手造边界情况样例!
若出现序列最值相关,可以用曲线代表序列,这样可以一眼看出最值。
一般 “出现次数” 都与 根号分治 挂钩,因为出现次数少的数(称为小数)可以直接考虑出现次数,出现次数多的数(称为大数)可以直接考虑每个数,这样就出现了根号。处理大数时可以直接枚举,处理小数时则应该利用其个数不超过 \sqrt n 先预处理,接着枚举每一次出现。其本质也是因为出现次数 c 之和形如 \sum c=n 及和为定值。比如 P8330 [ZJOI2022] 众数
刘思成:不确定状态(动态调整):记录存储了几个,而不记录具体是什么,每次相当于是对个数的不同的修改,最鲜明特点,需要 \(\mathcal O(n^2)\) 的复杂度。
\(\sum a=n,则\lor a\in [0,n]\\a+b\ge a\lor b\ge a\oplus b\ge a\land b\)
找到特殊的点进行划分!
有时候加DP状态可能不会改变时间复杂度,但会减小实现复杂度
求\([x^n](\sum_{i}a_ix^i)(\sum_{i}b_ix^i)\)可以考虑枚举左侧的项,找到对应的右侧的项,而不用真正将这个展开形式求出来。(有时求不出来)
关心全局与关心最值的转换:\(\forall a_i\le x\implies\max(a_i)\le x\)
\([a\bmod p< lim]=\lfloor\frac{a}{p}\rfloor-\lfloor\frac {a-lim}{p}\rfloor\)
压位trie
插入删除、前驱后继
可以做到接近 \(O(1)\)
线段树合并
三种情况
- 
对应位置相加 
- 
一边合并一边更新所穿的传参数[minimax] 
- 
需要先合并左子树,再利用左子树的信息合并右子树。 
如果算法以\(A\xrightarrow{建出结构}B\xrightarrow{优化}C\),则有时无需将 \(B\) 显式 建出来,而是考虑如何直接优化。
如:[NOI2019弹跳],\(KDT\xrightarrow{建出结构}图\xrightarrow{优化}最短路\)
可以直接 \(KDT\)优化最短路, 复杂度减小一个$\log $
建超级原点(有时也可以加上超级汇点),化多元最短路为单源最短路。
可以结合分治使两边独立。

最短路径树/图
对所有使得 \(dis_v=dis_u+v(u,v)\) 成立的 \((u,v)\) 连边就是图。对于每个 \(v\) 只连一条就是树。
常用于简化动态变化的最短路问题。
\(k_1+k_2\implies (1+k_1x)(1+k_2x)\bmod x^2\)
code
 
 
取名字是个很好的思考方法,比如把满足 \(\dots\) 的叫做”\(\color{red}红点\)“,不满足的叫做"\(\color{black}黑点\)",这样易于思考。
动态规划:每个状态看作一个向量,一次 \(u\to v\) 的转移看作 \(v\) 原有的向量乘上由 \(u\) 生成的矩阵 \(E_u\)。
--
不开deque就开list,list提醒您,1e6的deque会炸而1e6个list不会。
单调栈实现的斜率优化是可行的。
- 
线段树套平衡树比树套树好,空间少一个log。 
- 
vector的两倍空间会被卡。 
- 
dijkstra 如果可以每次选择最小的边而不是点,可以做到每个点仅被扩展一次,及扩展到就确定。 
总结基本数据结构问题及其做法
下面两份代码中,第一份(vector)定义在外面要比第二份快。
vector<int> t;
loop(i,1,m)
    loop(j,i+1,m){
        t.clear();
        ...
    }
loop(i,1,m)
    loop(j,i+1,m){
        vector<int> t;
        ...
    }
因为clear并不会释放内存,这使得每次直接复写而不是不断的加入删除。
分块可以分为整\(\to\) 整,整$\to $ 散,散\(\to\) 整,散$\to $ 散 考虑,其中 "散"可以暴力,"整"应该 \(O(1)\)。
一个做法想了超过15分钟没有任何进展就不要再想了,可以肯定想不出来了。
总结:D1T2 和 D2T2 都是从简化问题入手,通过结合两个问题维度上的扩展得到正解,做这两道题让我受益匪浅。这让我想到了平行四边形,给它加上对角线相等的条件就成了矩形,给它加上邻边相等的条件就成了菱形,将两者结合在一起就成了正方形。有的时候从平行四边形到正方形是困难的,但从平行四边形到矩形和菱形是自然的,而它们的结合也是自然的。这给出了我们思考问题的一条有效的道路,同时也说明了为什么从部分分开始思考,一步一步打暴力是优秀的。我希望大家都能体会到这一点。——Alex_WeiP8497 [NOI2022] 移除石子

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号