Loading

【题解】AGC024E Sequence Growing Hard

那个 \(O(n^3)\) 的 dp 没太懂 /yun 。

一个一个数往里面插入,为了去重,插入 \(x\) 时,只能插在其他数的前面,同时因为字典序的要求,\(x\) 只能插到比其小的数的前面。

将第 \(i\) 次操作的 \(x\) 插入到了第 \(i'\) 次操作的 \(y\) 前面,看作是将节点 \((i,x)\) 挂在 \((i',y)\) 下面,这样就形成了一棵树(为了处理数插在最后面的情况,需要建虚点 \((0,0)\))。

注意到这棵树上所有节点的权值都比其儿子小,同时插入时间也比其儿子小。这样的话每一个序列组都对应了一棵树,同样我们可以通过一棵树还原出唯一的序列 —— 序列和树是一一对应的,只需要考虑对树计数即可。

\(f_{i,j}\) 表示 \(i\) 个节点的树,根节点权值为 \(j\) 的方案数。根节点的插入时间是最小的,将所有儿子按照插入时间依次加入避免算重,此时就只需要考虑插入时间最小的儿子(插入时间紧接根节点的插入时间)和该儿子的大小、权值了。

前缀和优化 dp 可以做到 \(O(n^2k)\)

代码:Submission #26111371 - AtCoder Grand Contest 024

posted @ 2021-09-26 11:34  Qiuly  阅读(48)  评论(0编辑  收藏  举报