题意:给定一个数组,通过ai=x+y的替换方式将数组替换成一个非递减数组,要求求出这个数组以及所有子数组形成非递减数组的最小op数。

思路:对于传统的dp,我们是从前往后递推,同时dp一般表示为前缀和的形式。我们发现该题的操作方式每一个元素如何变换其实是依赖后面数组(无论有无变换)的开头一个数字的。于是我们想到从后向前dp,朴素的表示方式为dpi,j 从i开始的后以j开头的子数组的数量。

为什么表示的是后面子数组的数量呢?这就与每个元素的贡献值有关了,很显然,对于每一个元素来说,他的贡献值是左边可扩展的子数组最大长度*右边子数组可扩展的最大长度*形成当前开头最小值的操作数

**我们将扩展的长度定义为原数组在操作前能够通过op实现合法的最大个数**

对于ai-1来说,当后一个数为c1的情况下,最小操作数=((ceil(ai-1/c)-1)。显然,c不变的情况下,最小操作数是不变的。同时,我们发现向前扩展的长度也是不变的即为i。

于是ans = (ans + (1ll * c * i % MOD * (k - 1) % MOD)) % MOD;(c为dp[i+1][ai/(ceil(ai-1/c)])

通过滚动数组优化空间。注意滚动数组使用后的复用初始化问题

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string>
#include<bitset>
#include<cmath>
#include<array>
#include<atomic>
#include<sstream>
#include<stack>
#include<iomanip>
//#include<bits/stdc++.h>//#define int ll
#define IOS std::ios::sync_with_stdio(false);std::cin.tie(0);
#define pb push_back
#define endl '\n'
#define x first
#define y second
#define Endl endl
#define pre(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,b,a) for(int i=b;i>=a;i--)
#define si(x) scanf("%d", &x);
#define sl(x) scanf("%lld", &x);
#define ss(x) scanf("%s", x);
#define YES {puts("YES");return;}
#define NO {puts("NO"); return;}
#define all(x) x.begin(),x.end()using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
typedef pair<char, int> PCI;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<ll, ll> PLL;
const int N = 1000010, M = 2 * N, B = N, MOD = 998244353;
const double eps = 1e-7;
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;//int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
int dx[8] = { 1,2,2,1,-1,-2,-2,-1 }, dy[8] = { 2,1,-1,-2,-2,-1,1,2 };
int n, m, k;
int a[N];
ll dp[2][N];
ll ans;
int cur;ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lowbit(ll x) { return x & -x; }
ll qmi(ll a, ll b, ll MOD) {ll res = 1;while (b) {if (b & 1) res = res * a % MOD;a = a * a % MOD;b >>= 1;}return res;
}inline void init() {}void slove()
{cin >> n;int mx = 0;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);mx = max(mx, a[i]);}for (int i = 1; i <= mx; i++)dp[0][i] = dp[1][i] = 0;dp[cur][a[n]] = 1;ans = 0;for (int i = n - 1; i >= 1; i--){for (int j = 1; j <= a[i + 1];){int v = a[i + 1] / j, c = dp[cur][v], k = (a[i] + v - 1) / v;ans = (ans + (1ll * c * i % MOD * (k - 1) % MOD)) % MOD;dp[cur ^ 1][a[i] / k] += c, dp[cur][v] = 0, j = a[i + 1] / v + 1;}++dp[cur ^ 1][a[i]]; cur ^= 1;}printf("%d\n", ans);
}signed main()
{//IOS;int _ = 1;si(_);init();while (_--){slove();}return 0;
}
/*
8
abccdbad*/

A. Extreme Extension相关推荐

  1. Extreme Extension 思维,dp

    题意: 给一数组a,可对其中aia_iai​进行如下操作:将aia_iai​拆成两数之和,然后代替aia_iai​加入数组中.设一个数组的 extremeextremeextreme valueval ...

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

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

  3. CF1603C Extreme Extension

    不难发现分裂一个数最优的分裂一定是尽量平均的分裂,然后小的在前,大的在后,考虑如何求一个序列的最小操作数,容易想到一个贪心策略,从后往前,如果当前这个数比后面的数大,找到一个最小的 k k k使得, ...

  4. TVM apps extension示例扩展库

    TVM apps extension示例扩展库 此文件夹包含TVM的示例扩展库.演示了其它库如何在C++和Python API中扩展TVM. 该库扩展了TVM的功能. python模块加载新的共享库, ...

  5. ios share extension 真机不显示_ios企业签名:APPGroups实现App之间数据共享

    一.认识App Groups AppGroup allows data sharing between two different apps or even app and widgets by cr ...

  6. php解决 mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysq

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. The mysql extension is deprecated and will be removed i ...

  7. 解决 The mysql extension is deprecated and will be r

    为什么80%的码农都做不了架构师?>>>    解决 The mysql extension is deprecated and will be removed in the fut ...

  8. Chrome Restful Api 测试工具 Postman-REST-Client离线安装包下载,Axure RP Extension for Chrome离线版下载...

    [Postman for Chrome 离线下载] Postman-REST-Client离线安装包,可直接在Chrome浏览器本地安装使用,可模拟各种http请求,Restful Api测试, CS ...

  9. Chrome Extension 检查视图(无效)处理方法

    最近闲来无事,简单看了下Chrome扩展的开发,并且开发一个小小的翻译插件(TranslateBao)作为练手,开发细节不详述了,如果有新学习chrome extension开发的新人,可以参考源码, ...

最新文章

  1. 一套即时通讯聊天程序源码 VUE写的
  2. python网络爬虫学习笔记(一):网页基础
  3. FreeBSD6.1学习笔记[转]
  4. 编译原理 - SLR(1)
  5. Silverlight的依赖属性与附加属性(六)
  6. 金蝶KIS专业版V14.1生产任务单|销售单等单据图片打印
  7. PS魔棒工具的使用方法
  8. 技术笔记:.Net全套就业班视频教程——数据库
  9. 【数据挖掘算法竞赛】山东省-公积金贷款逾期预测TOP8 baseline523
  10. 论文阅读:Reasoning about Object Affordances in a Knowledge Base Representation
  11. 阿里小蜜商家版投入测试 为商家服务扩容
  12. [暑假]简单认识一下常用的字体 <<微软雅黑 黑体 和 宋体>>
  13. 电子书产品日趋丰富,科大讯飞智能办公本仍是理想之选
  14. Pycharm 小技巧-- filewacher+black自动格式化
  15. 机器学习实战---PM2.5预测
  16. 疲惫!很疲惫(发发牢骚)
  17. mysql stdistance_C#开发SQLServer的Geometry和Geography存储
  18. Blender齿轮制作
  19. 3B大战续集,你亲谁?
  20. 这些算法可视化网站助你轻松学算法

热门文章

  1. NULL, '\0',0 '0'的区别
  2. 测试开发是什么?为什么现在那么多公司都要招聘测试开发?
  3. 世界海洋日 | TcaplusDB号召你一同保护海洋生物多样性
  4. 什么是Linux系统架构?
  5. JLINK V8更新固件
  6. excel链接到另一个工作表的指定位置
  7. 2018noip模拟 烷基
  8. Android Native Crash崩溃及错误原因分析二-实战解决
  9. 你们知道怎么将图片转成ico? 小妙招分享给你
  10. 模拟鼠标键盘操作,含硬件模拟技术