专栏文章

题解:AT_abc431_f [ABC431F] Almost Sorted 2

AT_abc431_f题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@min9y7dx
此快照首次捕获于
2025/12/01 22:58
3 个月前
此快照最后确认于
2025/12/01 22:58
3 个月前
查看原文
比较巧妙的数数题。

思路

一般的有限制类数列计数都是从两种方向考虑,一种是从左往右逐一确定值,另一种是从小到大逐一确定位置。对于这道题来说,我们考虑第二种计数方式。
先假设 AA 中元素没有重复的,并令其递增。设 fif_i 表示将 AA 的前 ii 小重排后得到的满足条件的数列有多少个。考虑把 AiA_i 插入长为 i1i-1 的满足条件的数列中。显然如果长为 i1i-1 的数列不满足条件,则插入一个数一定不会使其变得满足条件,此时我们再来看一看限制:
Bi+1BiDB_{i+1}\ge B_i-D
由于排序后 AiA_i 肯定大于所有前面的数,所以我们不需要考虑 AiA_i 前面放的什么,只需要考虑 AiA_i 后面放的什么。显然能够放在 AiA_i 后面的数一定 [AiD,Ai]\in[A_i-D,A_i],或者干脆把 AiA_i 放到最后,于是我们双指针一下找到 AiA_i 前面有多少个这样的数,记为 xx,则有:
fi=fi1(x+1)f_i=f_{i-1}\cdot (x+1)
最后考虑去重,显然我们的算法区分了不同位置上的相同的数,对于一个出现了 kk 次的数,我们对答案乘上 k!1k!^{-1} 就结了。
时间复杂度 O(nlogn)O(n\log n)

评论

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

正在加载评论...