atcoder ABC385 部分题解

G - Counting Buildings

简要题意

一个排列的 L(P)i=1n[premax(i)=Pi],即前缀最大值为自身的位置数,R(P) 同理为后缀最大值。

有多少个排列使得 L(P)R(P)=k

题解

假设 n,k 是同阶的。

我们从 n1 依次插入数,考虑朴素的 DP:设 fi,k 表示当前填了 [ni+1,n] 这些数,LR=k 的方案数。当插入一个数时,将其放在首位 L 一定增加 1 ,放在末尾,R 一定增加 1 ,其余位置,L,R 不变,有转移:

fi,k=fi1,k1+fi1,k+1+(i2)fi1,k

Fi=[xk]fi,k,我们最终求 [xk]Fn

该状态转移可以写成多项式形式,即 Fi=(x+(i2)+1x)Fi1 ,那 Fn=i=2n(x+(i2)+1x)=i=0n2(x+i+1x)

负系数不太好维护,改成 [xk]Fn=[xk]i=0n2(x+i+1x)=[xk+n1]i=0n2(x2+ix+1)

两个幂次为 n 的多项式乘法可以在 O(nlogn) 的复杂度下完成。运用启发式合并的思想,我们每次找到当前次数最小的两个多项式做乘法,每个多项式最多被计算 O(logn) 次,总的复杂度为 O(nlog2n)

当然,可以使用分治模拟启发式合并的过程,保证每一个搜索层下,现有多项式的次数都尽可能的平均,也就是模拟了启发式合并。

多项式乘法用 NTT 。

参考代码(分治做法)

posted @   蒻蒻虫  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示