版权声明:本文为博主原创文章,转载时请标明出处。 https://blog.csdn.net/FarmerJohnOfZS/article/details/71250170
犯错集合
- 善用CtrlCV,加快打字速度。
- 认真训练,不要CB!
- 调试用代码要注释于旁边 比如
/*调试*/
- 不吝啬于打注释 尤其是思路不清晰时(当然最好还是想得很清楚了再开始)
- 边集数组2 线段树数组4 etc.
至少判断每个数组的空间是否够 打代码时也要考虑越界问题
原因: C++ 本身不可能报数组越界 只知道把指针瞎指 - 不要随意全开
ll
平时偷个懒问题不大 - 比赛前一天晚上好好睡觉! 早起床,吃好早餐,别碰咖啡!
Ctime
中的clock()
可以用于算运行时间time(0)
用于srand()
(tmp)
等价于(tmp!=0)
而非(tmp>0)
- 比赛里的题目顺序不要管!血淋淋的例子GDKOI2018Day1
- O2要求十分严格 可能导致RE 所以不必要就别开
- 函数不要作为循环范围(如ve[].size()) 建议记下来再用
- vector 可能导致空间&时间二倍 也可以通过提前reserve防止其按二进制分配空间
- 当题目复杂时,确立单一观察对象思考 例:各类hanoi
- double 不能用memset赋极值(清空海星) 看上去值没问题 比大小时会出锅
- struct 的 memset 需要使用 memset(&t,value,(sizeof t)或(sizeof(struct_name)));
- 某种情况计算多次时 记得先考虑情况数是否整除 则考虑算完总数后作除法
- 搜索顺序对时间影响巨大 不确定时可以对拍寻找较快顺序(反正只用改一点点)
- 如果搜索题目剪枝编程复杂度较高 建议先打基本版 然后去做其他题 最后当提答题玩一玩差不多了
- Hall定理:存在从V1到V2的完全匹配 当且仅当V1中任意k个顶点至少与V2中k个顶点是相连的
- __Int128的输出要判断正负数
- 对于大部分关于集合{x|x=f(y),y属于S}
- 三维问题都可以采用 枚举(排序)一维+分治一维+数据结构一维
- 可以认为T(动态开点)=3*T(离线离散化) 所以不要轻易作死!!!
- LL比INT慢一倍!!!!
- cmd的fc是不忽略行末空格&(\r\n)的
- 打表拆系数是个好方法嘤嘤嘤
- 如果不知道怎么做就尝试重新描述题目吧!
- 有时在dfn很难线性实现时 不如改成类记忆化搜索吧!
- 当复杂度涉及已删除点时 要考虑被删除者是否被扫描 当复杂度涉及已删除点时 要考虑被删除者是否被扫描
- 不要轻易推翻原有的结论 很可能是极端条件杂糅(某些极端不共存)
况且脑子还是新鲜的好用[吓] - 对拍时 请再三检查随机数据的一般性和暴力的正确性
- 变元矩阵树定理:
令A[i,i]=\sum e[i][j],A[i][j]=-e[i][j];注意负号!
删去第r行第r列(1<=r<=n) 后,det(A’)就是各个生成树的边权积的总和 - 求行列式的N^3做法:高斯消元(行列加减)成上三角 此时答案就是对角线上(n-1)个量的乘积
- 稳定的排序算法:(带序号)相同元素结果稳定 而非时间
- 大部分C++程序数组下标从0开始(记得因为初赛挂过&看标慢)
- 有这样一类题目:边权=两点点权异或/gcd/… 求最小生成树 一般可以先把一些点(如点权相等)并在一起简化题目
- 然后!如果需要求方案数,需要算上最开始合并那些点的方案贡献(n^(n-2))
- 各类DP都可以考虑打成记忆化 好用范围:冗余状态多
- n个点n条边是环套树!为什么我以前一直不知道[捂脸emoij]
- 康托展开:一个排列的排名为 \sum [a_i为左的逆序对个数]*((i-1)!)
逆康托展开 从第一个填什么或者从最小值位置开始考虑 - 考前三日 辛辣是禁忌 没有为什么!!!
- sort区间左闭右开
- 简记tarjan 边双:去掉割边 再给每个联通块染色 割边(x,y)满足low[y]>dfn[x]
点双:当dfn[x]==low[x]时 当前点为割点 所以 比它dfn大&&没有被其他割点隔开的部分都属于这个点双 具体说来 开一个栈保存当前遍历到的部分 跑完子树后判x是否为最高点 (因为手推出锅太多次所以废话嘤嘤嘤)
个人缺陷
- 数据结构,字符串练习少
- 容易开小差
脑子里汪洋大海- 代码调试不熟悉 几乎没有技巧性可言
对睡眠和食物需求量极大
好想法
- 非递归求 dfs 序( 和根已知)
考虑每个点x
{
找重儿子s
dfn[s]=dfn[x]+1;
求剩下儿子dfn(和sz有关)
}
- 二分答案求前k大 (例3329树上的路径)