CF1748E Yet Another Array Counting Problem

CF1748E Yet Another Array Counting Problem

yzxoi

2022-11-14 (Updated: 2022-11-14)

oi

ST, dp, 二分

对于长度为 n 的序列 x,定义其在子段 [l;r] 的“最左端最大值位置”为最小的满足 l\leq i\leq rx_i=\max_{j=l}^rx_j 的整数 i。给定整数 n,m 和长度为 n 的序列 a,你需要求出满足下列要求的序列 b数量

  • 序列 b 长度为 n,且对任意整数 i(1\leq i\leq n) 都有 1\leq b_i\leq m 成立。
  • 对任意整数 l,r(1\leq l\leq r\leq n),总有 a,b 在子段 [l;r] 的“最左端最大值位置”相同。

答案对 10^9+7 取模。

n\leq 2\times 10^5n\times m \leq 10^6.

Tutorial

设区间 [l,r] 的最左端最大值位置为 f_{l,r}

,有:

p_1< m < p_2
b_m > b_{p_1}
b_m \leq b_{p_2}

至此,限制 2 即转换为以上限制。

一个区间视为一个节点,每个节点则按照如上构造可连出两个子节点,构造一棵二叉树。

dp_{u,x} 表示节点 u 对应区间的 m=x 时的方案数。

容易有转移:

dp_{u,x} = (\sum_{i=1}^{x-1} dp_{p_1,i})\cdot (\sum_{i=1}^x dp_{p_2,i})

对于求最左端最大值位置,ST 表+二分即可。

时间复杂度:O(n\log n)

180961828

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...