1 条题解
-
0
F. 无人需要 详细题解
题目核心理解
给定一个长度为 的排列 ,以及 个询问。 每个询问给出区间 ,求满足以下条件的下标递增序列数量:
- 所有下标 都满足 ;
- 下标严格递增:;
- 后一个位置上的数能被前一个整除:;
- 序列长度至少为 。
核心思路
1. 关键性质
- 因为是排列,每个数值唯一,可以用 表示数值 出现的位置。
- 答案具有可加性,可以按左端点从大到小离线处理询问。
- 用树状数组维护:以每个位置结尾、起点 的合法序列数量。
- 转移只发生在倍数之间,总转移次数为 。
2. DP 定义与转移
设:
- :起点为当前左端点 ,终点为 的合法序列条数。
- 初始:(单独一个位置本身就是合法序列)。
转移规则: 对当前位置的值 ,枚举它的所有倍数 , 如果 在 右侧,则
3. 统计答案
树状数组维护所有 , 询问 的答案就是树状数组上
算法流程
- 读入排列,预处理每个数值的位置 。
- 将所有询问按左端点从大到小排序,实现离线处理。
- 从 到 倒序枚举左端点 :
- 初始化 。
- 枚举 的所有倍数,更新对应位置的 值。
- 将 值更新到树状数组中。
- 对所有左端点为 的询问,查询树状数组区间 的和作为答案。
- 按原询问顺序输出结果。
公式与复杂度分析
转移公式:
$$\text{dp}[\text{pos}[y]]\ += \text{dp}[\text{pos}[x]] \quad(y \text{ 是 } x \text{ 的倍数},\ \text{pos}[y]>\text{pos}[x]) $$单次询问答案:
复杂度
- 预处理倍数:
- DP 转移:
- 询问处理:
- 总体:
可轻松处理 、多组数据总和限制。
- 1
信息
- ID
- 6572
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者