题意:

  • 给一数组a,可对其中aia_iai​进行如下操作:将aia_iai​拆成两数之和,然后代替aia_iai​加入数组中。设一个数组的 extremeextremeextreme valuevaluevalue 指的是:使得数组单调不下降的最小操作次数。据此,求a数组的所有子数组的 extremeextremeextreme valuevaluevalue 之和

思路:

  • 先考虑一个数组,显然,将末尾元素拆分是没有意义的,且会使答案增大。而对于中间元素,例如 ...[17],5,10,23,...... [17], 5, 10, 23, ......[17],5,10,23,... ,如果它违反了单调不下降的规则,就必须进行拆分,可以有多种拆法,但使得其中最小元素尽可能大,是最优的拆法。例如,拆成(4,4,4,5)(4, 4, 4, 5)(4,4,4,5)比(3,3,3,3,5)(3, 3, 3, 3, 5)(3,3,3,3,5)更好,因为这可能减少前面需要的操作数量,因此,相当于让拆分成的元素尽可能接近,且数量尽可能少,又要让其中最大的小于ai+1a_{i+1}ai+1​,那么,对于当前的数aia_iai​和下一个数ai+1<aia_{i+1}<a_iai+1​<ai​,我们应当拆分,例如这里17应当分为⌈17/5⌉=4\lceil 17/5 \rceil = 4⌈17/5⌉=4个数,所以最小数是⌊17/4⌋=4\lfloor 17/4 \rfloor = 4⌊17/4⌋=4。显然,如果aia_iai​比ai+1a_{i+1}ai+1​小,则认为我们将它“拆分成一个数”
  • 这样扫一遍下来,以O(n)O(n)O(n)解决了求解单个数组的问题,但是,子数组的数量是n2n^2n2数量级,不能全部这样求解
  • 考虑dpi,xdp_{i,x}dpi,x​是第iii个数被拆分成最小元素为xxx的若干个数,并且以xxx开头的非递减数列的数量。有dpi−1,ydp_{i-1,y}dpi−1,y​ += dpi,xdp_{i,x}dpi,x​,因此可以转化。
  • 一个数nnn拆分为最小元素xxx ∈\in∈ {nnn,⌊n/2⌋\lfloor {n/2} \rfloor⌊n/2⌋,⌊n/3⌋\lfloor {n/3} \rfloor⌊n/3⌋,…,111},这个集合中元素个数不是n个,而是O(n1/2)O(n^{1/2})O(n1/2)数量级的,这一点在整除分块的技巧中也有使用。
  • 最终我们根据dpdpdp数组统计答案。对于dpi+1,xdp{i+1,x}dpi+1,x,它对答案的贡献是i∗dpi+1,x∗(⌈ai/ai+1⌉−1)i * dp_{i+1,x} * (\lceil a_i / a_{i+1} \rceil - 1)i∗dpi+1,x​∗(⌈ai​/ai+1​⌉−1),这是因为有i∗dpi+1,xi * dp_{i+1,x}i∗dpi+1,x​个数列,每个数列对aia_iai​执行这样的拆分
#include <iostream>
#include <unordered_map>using namespace std;typedef long long ll;const int N = 1e5 + 10;
const ll mod = 998244353;int a[N];int main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _;cin >> _;while (_ -- ){int n;cin >> n;for (int i = 1; i <= n; i ++ ) cin >> a[i];unordered_map<int, int> dp[2];ll ans = 0;for (int i = n; i >= 1; i -- ){dp[1][a[i]] = 1;for (auto it : dp[0]){int t = ceil(a[i] * 1.0 / it.first);dp[1][a[i] / t] += it.second;ans += ((ll)i * it.second) * (t - 1);}ans %= mod;swap(dp[0], dp[1]);dp[1].clear();}cout << ans << endl;}return 0;
}

Extreme Extension 思维,dp相关推荐

  1. [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)

    problem CodeForces solution observation1:\text{observation1}:observation1: 对于一个非空子段 [l,r][l,r][l,r], ...

  2. CodeForces - 1353E K-periodic Garland(思维+dp)

    题目链接:点击查看 题目大意:给出 n 个灯泡以及其初始状态(开或关),每次操作可以将任意一个灯泡的状态置反,问最少需要操作多少次,可以使得所有开着的灯泡之间相距 k 个单位 题目分析:因为需要满足所 ...

  3. 思维dp ---- Codeforces Round #142 (Div. 1) D. Towers

    题目链接 题目大意: 你可以把第iii座塔和i+1i+1i+1座或i−1i-1i−1座合并成一个 使得到的那座塔的高度是原来两座塔的和 问最使序列变成严格不增最小合并次数 解题思路: 首先我想到的是贪 ...

  4. 思维dp ---- CF41D Pawn [可达状态统计dp]

    题目链接 题目大意: 解题思路: 如果没有 k+1∣∑wk+1|\sum wk+1∣∑w 的限制的话就是个简单的 dp dp[i][j]=max(dp[i+1][j−1],dp[i+1][j+1])d ...

  5. 思维dp ---- 复杂状态找中间状态作为dp状态 1552F - Telepanting

    题目链接 题目大意: 有个蚂蚁从000号点要到xn+1x_n+1xn​+1的位置. 在x0,x1,x2,x3,.....,xn+1,xnx_0,x_1,x_2,x_3,.....,x_{n+1},x_ ...

  6. 思维dp ---- K步最短路 D. Explorer Space

    题目链接 解题思路: 这题目本质就是求K/2步最短路然后乘以2就可以了因为要回去嘛 如何求k/2步最短路呢? 就是我们dp[k][i][j]dp[k][i][j]dp[k][i][j]求的是kkk步到 ...

  7. 思维dp ---- Codeforces Round #722 (Div. 1) B. Kavi on Pairing Duty [思维dp + 数学]

    题目大意: 将2n2n2n个点两两相连形成n对,对于任意两个点对A和B,要求至少满足其中一条: 1.A和B的某一个完全包含于另一个中 2.A和B的长度相等.问你一共有多少种方案. 解题思路: 题解:假 ...

  8. D.Digits 思维dp 取log乘积变成加法

    题目链接 题目大意: 就是给你nnn个数和一个数字ddd,问你从这n个数中挑出若干个数,使得这些数的乘积最后的一个数字是d,并且结果是最大的,问你要挑出哪些数字? n∈[1,1e5],ai∈[1,10 ...

  9. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

最新文章

  1. Spring-AOP基础知识
  2. 存储mysql数据存在特殊字符时处理_SQL数据库对于保存特殊字符的解决办法
  3. oracle数据库连接数超了,oracle数据库当前和最大连接数
  4. Shell Scipt 命令行带参数,输出log
  5. 防抖、节流(细讲)【面试】
  6. redis密码设置、访问权限控制等安全设置
  7. DeskClock选择闹钟声音时有重复选项
  8. 使用python写机器学习算法遇到的问题
  9. eclipse环境NDK问题汇总
  10. Audio-driven Talking Face Video Generation with Learning-based Personalized Head Pose (译文)
  11. 嵌入式要学习哪些内容?
  12. python,画3D图,瀑布图
  13. 心电信号系统GUI系统
  14. 微信小程序 计算两点及多点间的距离+选择地图定位
  15. 计算机组成原理第二章笔记---计算机进化与性能
  16. 安装了 gosublime出现错误: MarGo: Missing required environment variables: GOPATH
  17. discuz手机版帖子页面支持表格添加边框及边框颜色
  18. 破壳问答 | 收集问题
  19. Android:NDK
  20. 2020-12-18T16:51:56+08:00 时间转换方法

热门文章

  1. 50、Power Query-Text.Contains的学习
  2. SAP 系统参数设置 RZ10 RZ11
  3. 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
  4. SAP快速找到定制配置
  5. 流程审批OA办公系统解决财务报销等问题
  6. SAP中会计凭证和物料凭证的对应关系
  7. Function Two
  8. 围城之势已起,拼多多骑虎难下
  9. java vue20.2.2浏览器_支持 Java 15!Java 开发工具 IntelliJ IDEA 2020.2发布
  10. mysql left day 7_day7-mysql函数