专栏文章

Again Counting Stars 糖糖做法

个人记录参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@min1okm6
此快照首次捕获于
2025/12/01 19:07
3 个月前
此快照最后确认于
2025/12/01 19:07
3 个月前
查看原文
前面的转化不说了,现在要解决的问题如下:
给出单调不增数组 s1,,sn1s_1, \ldots, s_{n-1},你需要对每个 1pn1 \leq p \leq n 计数有多少个数组 b1,,bn1b'_1, \ldots, b'_{n-1} 满足:
  • bb' 单调不增,且 bisi b'_i \geq s_i
  • 若存在 bi>sib'_i > s_i,则所有这样的 ii 构成一个区间,区间包含 ppp+1p+1
这里和官方题解是完全反着的,相当于做的是后缀和而不是前缀和。
然后把序列 reverse,相当于 ssbb' 都是单调不降的。
这个时候就相当于要对于每个 ii 计算 bib'_i 是第一个 b>sb'>s 的位置的方案数,以及 bib'_i 是最后一个 b>sb'>s 的位置的方案数。称前者为 AiA_i,后者为 BiB_i
我们考虑暴力 dp 是怎么做的,相当于记录 fi,jf_{i,j} 表示 bi=jb'_i=j 的方案数,然后转移是先做前缀和再删掉一个前缀。
我们熟知对多项式求前缀和还是多项式,但是删掉一个前缀的处理比较烦。
于是考虑不要求不合法的位置是 00,只保证合法的位置的值是对的。
此时相当于 F(i)F(i) 变成 FFlil\sim i 的前缀和,ll 是没被删的最小位置。
可以看出 FF 显然是多项式,于是直接维护连续点值拉插可以做到 O(n2)O(n^2) 求一个 AiA_i 以及 ii 作为起点对每个 BjB_j 的贡献。
于是求一个 BiB_i 相当于对所有 jj 求它们作为起点的贡献和,相当于维护 FF 之后多一个加入 sis_i 这个新起点的转移,也就是全局 +1+1
于是求所有 BiB_i 可以做到 O(n2)O(n^2),而求所有 AiA_i 就直接把做法转置就好了。
这样我们可以跑出最优解 77 倍的时间。

评论

2 条评论,欢迎与作者交流。

正在加载评论...