错误总结

· · 个人记录

前言:自2020.08.05日记起,灵感来源于cdcq大佬处

#

1.不开long long见祖宗;(P3178)
2.少看了个\sum,导致把题目想的很难;(某次CFdiv3E1)
3.注意算的时候不要超long long(某某oiRound3 C调了一小时)
4.注意完全背包问题可以选0个,所以循环从0开始循环
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=m;k>=j;k--)
dp[i][k]=max(dp[i][k],dp[i-1][k-j]+maze[i][j]);
5.注意题目是否需要字典序输出结果
6.BFS时没有memset(vis,0,sizeof(vis))导致调了许久(某三维BFS)

7.每个点只要访问一次,dij堆优时应该有vis(会TLEP4779)

8.kruskal跑完建边时起点和终点都用它们的父亲节点连边;(P1967)
9.LCA:X与Y一起往上跳时限制条件为fa[x][i]!=fa[y][i]而不是d[fa[x][i]]!=d[fa[y][i]] (P1967)
10.LCA:x与y同时跳时x=fa[x][i],y=fa[y][i],不要写错:y=fa[x][i](P2680调了2小时QAQ)
11.注意想要模的数和输入的数是否相同,用的是p还是mod(P3384树剖模板)
12.d[top[x]]>d[top[y]]时往上跳,而非dfn[top[x]]>dfn[top[y]](P3384树剖模板)
13.设重儿子时设成了siz[v],应该是v(P2590)
14.线段树修改时别忘了pushup(P2590)
15.树链剖分修改时用dfn去修改,而不是直接拿点去修改(P2590)
16.线段树二叉往右时rt坐标不要和往左时一样了!!(P2590)
17.树链剖分查询时top[u]与top[v]交换原则非dfn[top[u]]<dfn[top[v]],是d[top[u]]<d[top[v]](P2590)
18.树链剖分查询时u与v在一条重链上时u与v交换原则非u>v,是dfn[u]>dfn[v](P2590)
19.状压答案是dp[(1<<n)-1]而不是dp[1<<n] (P3052)
20.重链修改是fa[top[x]]而不是fa[top[dfn[x]]](P3178)
21.不要把数组开小了!!!(P3178 AC,WA,RE,TLE,OLE,MLE的原因/^\)
22.用priority_queue时注意将vector写在前面,greater写在后面,不要写反了!!!

23-1.注意检查输入如果int用scanf("%lld",&n)输入的话定为语法错误,洛谷上与本地会没有问题,然而Linux上可能出现问题!!(NOIP2020T1惨痛的教训/某CF DIV2崩盘原因)

23-2 同理,long long也不能用scanf("%d",&n)输入了,考试时要仔细检查!!(P3833)

24.注意题目时间与空间要求,不要数组开爆变成MLE了!(P3796)

25.dinic每次bfs前别忘了memset(dep,0,sizeof(dep))!(P3376)

26.dinic用链式前向星时tot初始值设为-1!(P3376)

27.使用hash&map时a*n+k中的常数a尽量调大些,不要调成N,至少到10*N及以上(USACO 2021JAN1)

28.dinic做弧优化的时候是for(int& i=cur[u];i!=-1;i=e[i].nxt),不要写成for(int& i=p[u];i!=-1;i=e[i].nxt)(P2740)

29.Splaying时判断往左往右的条件是将spl[x].val与spl[y/l/r].val对比,不是将x与spl[y].val对比(P6136)

30.Splay进行del时若spl[now].val==val时要break,否则会死循环(P6136)

31.注意将a=a-b-c时代码:a-=b+c,而不是a-=b-c(a-b+c)!!(P6136)

32.dinic循环dfs时下一次转换的点是v不要又写成u导致死循环了(dfs(v,min(e[i].w,lim)))(P3386/P2756)

33.区间DP枚举长度时注意范围是"<=数组的长度"还是"<数组的长度"(UVA1437)

34.期望推柿子时注意A^0=1而不是A...(P1291)

35.栈等数据结构求前缀和最大值时别忘了把初始值都设为-inf,否则有负数的情况下就会出错(P2201)

36.费用流dinic中SPFA时判断价值时vis条件要写在if里面,和d数组并排更新(P3381)

37.SPFA更新d数组时是用e[i].c更新,不是e[i].w;(P3381)

38.注意!vis[i]是没有遍历到的标志;(P3701)

39.莫队分块时注意块是q[i].l/len,不是i/len,否则等于没有分块(P2709)

40.莫队输出答案时注意是ans[i],不是ans[q[i].ord]了,注意回答的还原(P1494)

41. 注意写代码时不能写a<=b<=c,要写成a<=b&&b<=c(2021愚人节)

42. 云剪贴板,改文件后缀名,注意时间限制空间限制

43.float数据范围仅到1e7,若用浮点数尽量用double;(ABC207 C)

44.状压DP判断第i位是否为1:(1<<i)&a!=0,而不是(1<<i)&a==1,也不是(1<<i)|a!=0(P1879)

45.注意符合行阵要求的炮兵情况(ok数组)要在每一行时实时更新,不要漏了这一句话(P2704 状压DP)

46.用链式前向星时函数文件名用void,不用int,否则会TLE(P3478)

47.LCA循环时把次方层放在外面,否则更新的所有的2^1次方级的父亲都是1!!!(P3258)

for(int i=1;(1<<i)<=n;i++)
for(int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];

48.在用tarjan缩点求是否有一个点会能被所有的点通达时不能仅仅用拓扑排序来算,否则会有钻石型的数据致使答案发生错误(e.g. 1->2,1->3,2->4,3->4,2->5,3->5就会报错),只能用出度为0的点只有一个来判断(P2341)

49.注意树剖时要建无向边!!,不要只建成有向边了,否则dfs时会出问题(某次比赛差点AK,这个题调了2小时导致没AK QAQ)

50.尽量将长长的高精度程序写成一个函数,这样方便调试,不要写在主程序中,否则会浪费许多时间花费在调试上(除非程序过于简单)(P1018)

51.判断一个数组中的数能否被数组中其他数所组成时,要先排序,在从小到大做完全背包,注意每一次循环是循环到a_n,不是a_{i+1},否则后面的数无法受到前面的数的照顾 (P5020)

52.不用memset的地方尽量不用memset,否则容易TLE(hash)

53.在链式前向星时别忘了加上p[u]=tot,否则dfs是不会遍历边的!(P4281)

54.在线段树区间修改时别忘了在change与query函数中加上pushdown!(P1471)

55.注意所有的方差计算中的n都要用y-x+1替代,不要有的真的用代表“有n个数”的那个“n”了!(P1471)

56.注意主席树离散化时要注意是否a[0].num=a[1].num,如果等于需要将a[0].num设个绝对取不到的值,否则a[1].num离散化后为0!!!(P3834)

57.注意线段树修改时不要将change(l,mid,...)/change(mid+1,r,...)写成change(x,mid,...)/change(mid+1,y,...)了,(x代表修改位置,y代表修改数值了!!)(P3919)

58.帮同学记一下,bfs不能在访问到这个点出边时再vis[u]=1,应该在入边时就记vis[v]=1,否则队列中可能访问这个点很多遍!(某生成树题)

59.费用流不是dis[t]!=0,是dis[t]=0x3f3f3f3f

60.线性基中在插入时是a[i]&(1ll<<j),而非i&(1ll<<j)

61.注意并查集找自己的父亲时不能再新int x=get(x),而应该直接x=get(x),否则会使x直接变为0(常见错误)

62.注意在超空间动态规划时,若要将超过一个规定值的设置成规定值的时候,要将dp空间开成两倍,这样能够将所有的情况考虑进来,否则可能会有部分不接续(小的拼接不起来)的情况导致答案错误。(p4377)(常见错误)

63.一般如果要保留x位小数,则eps最好设置成1e-(x+2),,以保证精度问题。(P4377)

64.注意要计算时间差的问题(例如在矩阵中走路,需要第t秒需要经过某个点,别忘了将变量写成时间差)

65.计算好空间!不要MLE或RE了!

66.cdq分治中树状数组第三维的数据的范围不是n,是2e5(给定的上限值)(P3810)

67.注意相等的情况,要在结尾答案加上个数,anss[s[i].ans+s[i].sum-1]+= s[i].sum;(P3810)

68.快速幂不要写错,while(b)不要写成if(b)!(某模拟赛)

69.用tarjan求LCA注意特判a=b的情况,这时dfn[a]还未更新为2(即回溯过!)

70.注意输出solution or Solution(P3389)

71.在不知重边等特殊情况的存在下,不能依靠m>=n来判断图中是否有环(P6175)