消耗战合集

只计算编写代码和调试时间。

P2086 [NOI2012]魔幻棋盘

耗时:5h

原因:

  1. 写树套树试图代替二维线段树写挂(卡在单点修改不会写)放弃。
  2. 边界判断处理不当(命名可以从0开始避开一切bug,却傻乎乎从2开始)
  3. 没有处理负的gcd
  4. \(c\) 没有开long long;query没有开long long;gcd[]没有开long long;\(res\) 没有开long long;不敢define int long long
  5. \(gcd\)\(g\) 重复定义,交叉使用
  6. 一维线段树查询处把 \(m\) 写成 \(n\)
  7. 四分树query的时候将 \(D\) 写成 \(R\)
  8. \(arr\) 数组没有清空。
  9. 测试数据不算很弱,但不好造较强的数据(对拍时怎么拍两个的答案都是全1)

P3511 [POI2010]MOS-Bridges

耗时:3h(掺杂看题解的时间)

原因:

  1. 傻乎乎地连了个:addedge(u, v, 1), addedge(u, v, 0) 然而实际应该是 addedge(u, v, 1), addedge(v, u, 0)

  2. 不会快速找欧拉回路。首先上百度搜,方法看起来都不太一样,甚至还有和“桥”有关系的。然后看洛谷题解,题解里说:出题人应该没有毒到卡欧拉回路的求法,那么我们随机打乱边再 DFS 就完事了,并且给了个 random_shuffle 的代码,然后我就高高兴兴地去写了个暴力DFS+random_shuffle,然后交了三次都TLE了。然后又上网学,版本不一,并且找不到一篇好博客,随便拿了一个博客的方法半信半疑的写好交上去,结果WA+RE。最后凭借着之前TLE的90分看别人的AC代码,最后才过。可见网上会有一些恶毒的题解,不可全部相信啊

P2305 [NOI2014]购票(点分治做法)

耗时:约3.5h

原因:

  1. 没有看懂题解,于是晚上睡觉的时候自己瞎想了一个做法,比较复杂,过来实现了半个小时发现想假放弃。多谢zzy大佬的指导让我少走了不少弯路。

  2. Siz -= siz[] 写错位置导致无限死循环。

  3. get_dis的时候没写 if (vis)... 导致复杂度爆炸。

  4. 斜率优化没有清空凸包的栈。

  5. nw != fa[anc] 写成 nw != anc,导致少考虑了祖先。

  6. 二分凸包判断方向写反。

  7. 二分凸包未考虑到 mid == 1 而右边还有其它可能更优的决策点的特殊情况。

P5385 [Cnoi2019]须臾幻境

(硬生生把 170 行左右的代码写到了四百七十多行,估计能赶上 substring 了。)

耗时:3.5h

原因:

  1. pushup 中只对“边”点进行了初始化,并没有给“点”点初始化为 \(\infty\)。(这个调了两个小时)

  2. fa[son[cur][flag ^ 1]] = faa;faa 写成了 cur

  3. Access没有 \(splay(p)\)

  4. 强制在线应该 %m 却写成了 %n。(感谢机房大佬yxt的提醒)

  5. (根本原因)尝试在 LCT 内部使用输出调试,却只静态查错查了两遍

P3920 [WC2014]紫荆花之恋

耗时:4.5h

原因:

  1. 删除替罪羊树重构部分的时候忘记删除 stk[++stop] = ...,导致一直 RE。

  2. work 函数忘记连点分树上的边。

  3. work函数忘记将新建的点的 \(vis\) 设为 \(true\)

  4. work函数忘记初始化点分树子树大小

  5. 重构函数中忘记将原先的“根”重构。

  6. 重构函数中没有特判 \(faa\) 为0时的新根的 dian_fa 的情况。

  7. 重构函数中连边情况搞乱

  8. 点分治时计算 \(f2\) 时算出 \(Rt\)\(f2\),却传给了 \(cur\)

  9. 解决问题 8 的时候将 \(Rt\) 写成了 \(to\)

  10. 拍扁重新点分治的时候忘记在点分树上连边。

  11. 解决问题 10 的时候将 \(cur -> Rt\) 写成了 \(cur -> to\)

  12. 拍扁的删除操作中没有将 \(rt1, rt2\) 置零,导致下次仍然能正常调用。

  • 总结:

有的时候先写暴力的外层框架,再写比较难的部分(比如这道题先不重构,再只进行替罪羊树的重构,再写点分树的重构),在保证前面写的那些暴力框架不出错的前提下,调试后面的时候就不用怎么担心前面的部分会不会出错了。

静态查错是调数据结构的常用方法,但是有的时候对拍小数据调错也是不错的选择。

P4221 [WC2018]州区划分

(第一道进入消耗战合集的数学题)

用时:3h

原因:

  1. FWT 想假,觉得高维前缀和应该可以直接乘一个数,但是没注意到乘的是不同的数

  2. 子集卷积的顺序写反

  3. 邻接表存图误认为 e[i][j] 表示 \(i\) 的出边顶点为 \(e_{i,j}\),但是实际上是 \(j\)

  4. 欧拉回路的判断中 \(j\) 写成了 \(i\)

  5. 欧拉回路中直接for(i = 0 -> n - 1) for(j = 0 -> n - 1),但是这样会算重,导致啥都有欧拉回路。应该是for(i = 0 -> n - 1) for(j = 0 -> i - 1)

  6. FWT 的循环中 \(j\) 的上界写成了 \(n\),但是应该是 \(2^n\)

  7. 卡时间卡空间

P5180 【模板】支配树

用时:3.5h+(睡觉的时候都在想)

原因:

Tarjan yyds!! 实在读不懂他的论文,就自己瞎搞,造一堆错误算法。包含:

  1. 直接并查集维护链上祖先节点的父亲节点

  2. 并查集维护链上终极节点的 \(sdom\),但是这样会导致并查集混乱(把 \(sdom\) 归到并查集里面了)

  3. 并查集维护链上的 \(sdom\) 的最小值,用儿子更新祖先的信息(接近正解了,但是还是不对,因为如果信息来自 \(to\) 的下边,是不应该合法的,但是这样做会统计到)

  4. 各种代码上的错误,比如 \(dfn\) 的混乱使用,\(siz\) 当成 \(ans\) 用等等。

P3210 [HNOI2010]取石头游戏

用时:三天(总共大概6h左右)

(这题 \(lhm\) 代码只有 42 行)

原因:

  1. 无法理解为什么是对的,不知道该怎么写,并且刘队代码突然变得毒瘤起来,可能是我很少看他写链表吧

  2. 栈内元素的相对位置与真实位置搞混

  3. 在上三角的中间位置对其进行特判,并没有处理上三角的右边部分是“合成数”的情况。

  4. 没有处理两边的折线情况

  5. \(stop\) 当成了 \(i\).

  6. 特判两边折线的情况的时候对之前代码产生了影响。

P4218 [CTSC2010]珠宝商

用时:5h+(我也不知道到底用了多长时间,中间被NOI同步赛的那些事打断了好几次)

原因:

  1. len[p] 写成 len[q]

  2. 对 SAM 的掌握不够熟练,firstpos[nq] != len[nq],我把它忽略了

  3. SAM 上 DFS 的时候 \(nwlen\) 没弄清到底什么时候才改加

  4. Pushdown 直接 for(c = 0 -> 25) path[np][c] 导致常数直接变成 26 倍

  5. 没有在容斥的时候对儿子进行根号分治,导致复杂度退化为 \(O(nm)\)

  6. \(s\)\(ch\) 写反

  7. A.siz 写成 siz,所以最好不要重名啊!!!

  8. 有些地方 \(n\)\(m\) 写反了。

P5044 [IOI2018] meetings 会议

用时:3.5h

原因:

  1. \(taga\)\(tagp\) 打反

  2. 一开始将 \(ans\) 初始值设成了 inf

  3. 忘记区间加了

  4. \(dfs\) 内部分情况直接 return 导致有些询问没有被回答。

  5. modify(区间赋值为等差数列)部分需要对等差数列有关的一些特判。

CF573E Bear and Bowling

用时:3h

原因:

斜率优化重构凸包的时候没双关键字排序

CF607E Cross Sum

用时:3.5h

原因:

  1. 毒瘤出题人卡精度(大概第二个样例就是最强数据了)

  2. 树状数组写成 ++i

  3. vis = true 写成了 vis = false,然后效果跟没写一样

  4. lower_bound 写挂(加减写反)

  5. htot 写成了 n

  6. multiset 的重载运算符部分写挂,应该按 r 排序,我按的 l 排序,以为按 r 排序;然后发现后面我把二分参数传到了 r,就莫名调整到了 l,最后才调出来。

  7. 误将 htot/2 认成了交点个数,然后就错误地初始化了 ans

带权排序

用时:4h

主要原因:

标记永久化动态开点线段树的 pushup 直接写的 sum[cur] = sum[ls[cur]] + sum[rs[cur]],但是应该是 sum[cur] = val[cur] + sum[ls[cur]] + su[rs[cur]]

次要原因:

  1. 动态开点的值域范围控制不对

  2. 在递归的过程中 l,r 没有随着缩小

  3. 在递归的过程中 k,b 没有跟着变化

  4. 没清空 sum,val

后缀平衡树

用时:5h

原因:

  1. Insquery 函数总是写不对,主要是因为分不清什么时候 > 需要判成 false,什么时候需要判成 true

  2. 计数器混乱,三个与串长度有关的变量(\(n\)\(ttot\)\(slen\))混用。

  3. Del 函数总是写不对,调了好长时间后总算找全了所有特殊情况,然后发现一种情况我这种写法怎么也解决不了,大改了一通。

  4. Decode 函数总是写不对,主要是因为读错了题,以及 \(0\) 开头的串与 \(1\) 开头的串互相转换搞不对。

  5. 各种对 \(0\) 节点信息的修改

Kangaroos

用时:4.5h

原因:

  1. A[i]B[i] 都设成了一段相同值域中的第一个位置,导致后面的判断错误或漏判。
  2. 忽略了 l = r + 1 这种情况可能造成的 blong[l] > blong[r] 的情况。
  3. 回滚莫队又忘了在后面写 nwl = ed[blong[l]] + 1
  4. 对零散块的预处理时 if(A[i] < st[b] && B[i] > ed[b]) 写成了 if(A[i] <= st[b] && B[i] >= ed[b]) 导致可能会多判一些情况(主要还是 blong[l] > blong[r] 的时候会错)。
  5. 判断一个点是否会出现的时候使用 tol.h[p] || tor.h[p] 但是会在 p 加入时左右都出现的情况下出错。
  6. 判断线段是否相交的时候 B[sg[i]] >= l && A[sg[i]] <= r 写成了 A[sg[i]] <= l && B[sg[i]] >= r
  7. 零散块暴力求解后没有对 res 进行回滚。
  8. 零散块预处理的时候没有对 res 进行预处理。
  9. 调试后没有把 block=1 改回来导致TLE。
  10. 忽略了 l > blong[htot]r <= 0 的不合法情况。
  11. 没有 lst = blong[l] 导致TLE。
posted @ 2020-07-10 22:40  JiaZP  阅读(205)  评论(0编辑  收藏  举报