消耗战合集
只计算编写代码和调试时间。
P2086 [NOI2012]魔幻棋盘
耗时:5h
原因:
- 写树套树试图代替二维线段树写挂(卡在单点修改不会写)放弃。
- 边界判断处理不当(命名可以从0开始避开一切bug,却傻乎乎从2开始)
- 没有处理负的gcd
- \(c\) 没有开long long;query没有开long long;gcd[]没有开long long;\(res\) 没有开long long;不敢define int long long
- \(gcd\) 和 \(g\) 重复定义,交叉使用
- 一维线段树查询处把 \(m\) 写成 \(n\)。
- 四分树query的时候将 \(D\) 写成 \(R\)。
- \(arr\) 数组没有清空。
- 测试数据不算很弱,但不好造较强的数据(对拍时怎么拍两个的答案都是全1)
P3511 [POI2010]MOS-Bridges
耗时:3h(掺杂看题解的时间)
原因:
-
傻乎乎地连了个:
addedge(u, v, 1), addedge(u, v, 0)
然而实际应该是addedge(u, v, 1), addedge(v, u, 0)
。 -
不会快速找欧拉回路。首先上百度搜,方法看起来都不太一样,甚至还有和“桥”有关系的。然后看洛谷题解,题解里说:
出题人应该没有毒到卡欧拉回路的求法,那么我们随机打乱边再 DFS 就完事了
,并且给了个 random_shuffle 的代码,然后我就高高兴兴地去写了个暴力DFS+random_shuffle,然后交了三次都TLE了。然后又上网学,版本不一,并且找不到一篇好博客,随便拿了一个博客的方法半信半疑的写好交上去,结果WA+RE。最后凭借着之前TLE的90分看别人的AC代码,最后才过。可见网上会有一些恶毒的题解,不可全部相信啊
P2305 [NOI2014]购票(点分治做法)
耗时:约3.5h
原因:
-
没有看懂题解,于是晚上睡觉的时候自己瞎想了一个做法,比较复杂,过来实现了半个小时发现想假放弃。多谢zzy大佬的指导让我少走了不少弯路。
-
Siz -= siz[]
写错位置导致无限死循环。 -
get_dis的时候没写
if (vis)...
导致复杂度爆炸。 -
斜率优化没有清空凸包的栈。
-
nw != fa[anc]
写成nw != anc
,导致少考虑了祖先。 -
二分凸包判断方向写反。
-
二分凸包未考虑到
mid == 1
而右边还有其它可能更优的决策点的特殊情况。
P5385 [Cnoi2019]须臾幻境
(硬生生把 170 行左右的代码写到了四百七十多行,估计能赶上 substring 了。)
耗时:3.5h
原因:
-
pushup
中只对“边”点进行了初始化,并没有给“点”点初始化为 \(\infty\)。(这个调了两个小时) -
fa[son[cur][flag ^ 1]] = faa;
中faa
写成了cur
-
Access
没有 \(splay(p)\) -
强制在线应该
%m
却写成了%n
。(感谢机房大佬yxt的提醒) -
(根本原因)尝试在 LCT 内部使用输出调试,却只静态查错查了两遍
P3920 [WC2014]紫荆花之恋
耗时:4.5h
原因:
-
删除替罪羊树重构部分的时候忘记删除
stk[++stop] = ...
,导致一直 RE。 -
work
函数忘记连点分树上的边。 -
work
函数忘记将新建的点的 \(vis\) 设为 \(true\)。 -
work
函数忘记初始化点分树子树大小 -
重构函数中忘记将原先的“根”重构。
-
重构函数中没有特判 \(faa\) 为0时的新根的
dian_fa
的情况。 -
重构函数中连边情况搞乱
-
点分治时计算 \(f2\) 时算出 \(Rt\) 的 \(f2\),却传给了 \(cur\)。
-
解决问题 8 的时候将 \(Rt\) 写成了 \(to\)。
-
拍扁重新点分治的时候忘记在点分树上连边。
-
解决问题 10 的时候将 \(cur -> Rt\) 写成了 \(cur -> to\)。
-
拍扁的删除操作中没有将 \(rt1, rt2\) 置零,导致下次仍然能正常调用。
- 总结:
有的时候先写暴力的外层框架,再写比较难的部分(比如这道题先不重构,再只进行替罪羊树的重构,再写点分树的重构),在保证前面写的那些暴力框架不出错的前提下,调试后面的时候就不用怎么担心前面的部分会不会出错了。
静态查错是调数据结构的常用方法,但是有的时候对拍小数据调错也是不错的选择。
P4221 [WC2018]州区划分
(第一道进入消耗战合集的数学题)
用时:3h
原因:
-
FWT 想假,觉得高维前缀和应该可以直接乘一个数,但是没注意到乘的是不同的数
-
子集卷积的顺序写反
-
邻接表存图误认为
e[i][j]
表示 \(i\) 的出边顶点为 \(e_{i,j}\),但是实际上是 \(j\)。 -
欧拉回路的判断中 \(j\) 写成了 \(i\)
-
欧拉回路中直接
for(i = 0 -> n - 1) for(j = 0 -> n - 1)
,但是这样会算重,导致啥都有欧拉回路。应该是for(i = 0 -> n - 1) for(j = 0 -> i - 1)
。 -
FWT 的循环中 \(j\) 的上界写成了 \(n\),但是应该是 \(2^n\)。
-
卡时间卡空间
P5180 【模板】支配树
用时:3.5h+(睡觉的时候都在想)
原因:
Tarjan yyds!! 实在读不懂他的论文,就自己瞎搞,造一堆错误算法。包含:
-
直接并查集维护链上祖先节点的父亲节点
-
并查集维护链上终极节点的 \(sdom\),但是这样会导致并查集混乱(把 \(sdom\) 归到并查集里面了)
-
并查集维护链上的 \(sdom\) 的最小值,用儿子更新祖先的信息(接近正解了,但是还是不对,因为如果信息来自 \(to\) 的下边,是不应该合法的,但是这样做会统计到)
-
各种代码上的错误,比如 \(dfn\) 的混乱使用,\(siz\) 当成 \(ans\) 用等等。
P3210 [HNOI2010]取石头游戏
用时:三天(总共大概6h左右)
(这题 \(lhm\) 代码只有 42 行)
原因:
-
无法理解为什么是对的,不知道该怎么写,
并且刘队代码突然变得毒瘤起来,可能是我很少看他写链表吧 -
栈内元素的相对位置与真实位置搞混
-
在上三角的中间位置对其进行特判,并没有处理上三角的右边部分是“合成数”的情况。
-
没有处理两边的折线情况
-
把 \(stop\) 当成了 \(i\).
-
特判两边折线的情况的时候对之前代码产生了影响。
P4218 [CTSC2010]珠宝商
用时:5h+(我也不知道到底用了多长时间,中间被NOI同步赛的那些事打断了好几次)
原因:
-
len[p]
写成len[q]
。 -
对 SAM 的掌握不够熟练,
firstpos[nq] != len[nq]
,我把它忽略了 -
SAM 上 DFS 的时候 \(nwlen\) 没弄清到底什么时候才改加
-
Pushdown
直接for(c = 0 -> 25) path[np][c]
导致常数直接变成 26 倍 -
没有在容斥的时候对儿子进行根号分治,导致复杂度退化为 \(O(nm)\)
-
\(s\) 和 \(ch\) 写反
-
A.siz
写成siz
,所以最好不要重名啊!!! -
有些地方 \(n\) 和 \(m\) 写反了。
P5044 [IOI2018] meetings 会议
用时:3.5h
原因:
-
\(taga\) 和 \(tagp\) 打反
-
一开始将 \(ans\) 初始值设成了 inf
-
忘记区间加了
-
\(dfs\) 内部分情况直接
return
导致有些询问没有被回答。 -
modify
(区间赋值为等差数列)部分需要对等差数列有关的一些特判。
CF573E Bear and Bowling
用时:3h
原因:
斜率优化重构凸包的时候没双关键字排序
CF607E Cross Sum
用时:3.5h
原因:
-
毒瘤出题人卡精度(大概第二个样例就是最强数据了)
-
树状数组写成
++i
-
vis = true
写成了vis = false
,然后效果跟没写一样 -
lower_bound
写挂(加减写反) -
htot
写成了n
-
multiset
的重载运算符部分写挂,应该按r
排序,我按的l
排序,以为按r
排序;然后发现后面我把二分参数传到了r
,就莫名调整到了l
,最后才调出来。 -
误将
htot/2
认成了交点个数,然后就错误地初始化了ans
带权排序
用时:4h
主要原因:
标记永久化动态开点线段树的 pushup
直接写的 sum[cur] = sum[ls[cur]] + sum[rs[cur]]
,但是应该是 sum[cur] = val[cur] + sum[ls[cur]] + su[rs[cur]]
次要原因:
-
动态开点的值域范围控制不对
-
在递归的过程中
l,r
没有随着缩小 -
在递归的过程中
k,b
没有跟着变化 -
没清空
sum,val
后缀平衡树
用时:5h
原因:
-
Ins
和query
函数总是写不对,主要是因为分不清什么时候>
需要判成false
,什么时候需要判成true
。 -
计数器混乱,三个与串长度有关的变量(\(n\) 和 \(ttot\) 和 \(slen\))混用。
-
Del
函数总是写不对,调了好长时间后总算找全了所有特殊情况,然后发现一种情况我这种写法怎么也解决不了,大改了一通。 -
Decode
函数总是写不对,主要是因为读错了题,以及 \(0\) 开头的串与 \(1\) 开头的串互相转换搞不对。 -
各种对 \(0\) 节点信息的修改
Kangaroos
用时:4.5h
原因:
A[i]
和B[i]
都设成了一段相同值域中的第一个位置,导致后面的判断错误或漏判。- 忽略了
l = r + 1
这种情况可能造成的blong[l] > blong[r]
的情况。 - 回滚莫队又忘了在后面写
nwl = ed[blong[l]] + 1
。 - 对零散块的预处理时
if(A[i] < st[b] && B[i] > ed[b])
写成了if(A[i] <= st[b] && B[i] >= ed[b])
导致可能会多判一些情况(主要还是blong[l] > blong[r]
的时候会错)。 - 判断一个点是否会出现的时候使用
tol.h[p] || tor.h[p]
但是会在p
加入时左右都出现的情况下出错。 - 判断线段是否相交的时候
B[sg[i]] >= l && A[sg[i]] <= r
写成了A[sg[i]] <= l && B[sg[i]] >= r
。 - 零散块暴力求解后没有对
res
进行回滚。 - 零散块预处理的时候没有对
res
进行预处理。 - 调试后没有把
block=1
改回来导致TLE。 - 忽略了
l > blong[htot]
和r <= 0
的不合法情况。 - 没有
lst = blong[l]
导致TLE。