
1 | \section{错误六:答案计算缺少 $+\infty$ 守卫} |

1 | \section{错误六:答案计算缺少 $+\infty$ 守卫} |
https://acm.hdu.edu.cn/contest/view-code?cid=1199&rid=18676
https://acm.hdu.edu.cn/contest/view-code?cid=1199&rid=18673


1 | \section{错误七(TLE):循环内 \texttt{vector} 拷贝构造导致 $10^7$ 次堆分配} |

1 | \section{错误三:BFS 建自动机时 \texttt{nxt} 表不完整} |
另外,再提醒你两个后续也会出问题的点,虽然它们不是这次输出变成 1..8 的主因:
set<L_R_A_B_C> memo 判重会用到 operator<,但你把 step 也放进比较里了。1 | bool operator<(const L_R_A_B_C &o) const { |
这会导致“同一个局面但 step 不同”被当成两个不同状态,不是你真正想要的“局面判重”。
0/1 的:
> 手,代价是 1> 栈,代价是 00-1 BFS,或者至少用 dist 做最短路,不能简单地“第一次入队就判重”。如果你愿意,我下一条可以直接按你这份代码的风格,给你整理一个最适合这题打表的状态设计 + 0-1 BFS 写法。
最直接的原因是:你把初始栈建反了。
你后面的所有操作都把 vector::back() 当成栈顶:
1 | vector<L_R_A_B_C> op_lrabc() const { |
但你初始化的时候写的是:
1 | ll bfs(ll n) { |
这样 A 里实际是 [1,2,3,...,n],而 back() 是 n。
也就是说,你程序理解出来的“栈顶”是最大的盘,这和题意“越靠近栈底越大”正好反了。
所以你的程序会认为可以这样合法移动:
先拿出 n 放到空的 C
再拿出 n-1 放到 C,因为此时 C.back() = n > n-1
再拿出 n-2
一直这样下去
于是每个盘都只需要被拿起一次,答案自然就成了 n,所以你才会打出:
1:1
2:2
3:3
…
8:8
你这里概念上应该让初始 A 满足:如果 back() 是栈顶,那么 back() 必须是最小盘,也就是初始内容应当是 {n,n-1,...,1},而不是 {1,2,...,n}。