A. Extreme Extension
题意:给定一个数组,通过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相关推荐
- Extreme Extension 思维,dp
题意: 给一数组a,可对其中aia_iai进行如下操作:将aia_iai拆成两数之和,然后代替aia_iai加入数组中.设一个数组的 extremeextremeextreme valueval ...
- [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)
problem CodeForces solution observation1:\text{observation1}:observation1: 对于一个非空子段 [l,r][l,r][l,r], ...
- CF1603C Extreme Extension
不难发现分裂一个数最优的分裂一定是尽量平均的分裂,然后小的在前,大的在后,考虑如何求一个序列的最小操作数,容易想到一个贪心策略,从后往前,如果当前这个数比后面的数大,找到一个最小的 k k k使得, ...
- TVM apps extension示例扩展库
TVM apps extension示例扩展库 此文件夹包含TVM的示例扩展库.演示了其它库如何在C++和Python API中扩展TVM. 该库扩展了TVM的功能. python模块加载新的共享库, ...
- ios share extension 真机不显示_ios企业签名:APPGroups实现App之间数据共享
一.认识App Groups AppGroup allows data sharing between two different apps or even app and widgets by cr ...
- 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 ...
- 解决 The mysql extension is deprecated and will be r
为什么80%的码农都做不了架构师?>>> 解决 The mysql extension is deprecated and will be removed in the fut ...
- Chrome Restful Api 测试工具 Postman-REST-Client离线安装包下载,Axure RP Extension for Chrome离线版下载...
[Postman for Chrome 离线下载] Postman-REST-Client离线安装包,可直接在Chrome浏览器本地安装使用,可模拟各种http请求,Restful Api测试, CS ...
- Chrome Extension 检查视图(无效)处理方法
最近闲来无事,简单看了下Chrome扩展的开发,并且开发一个小小的翻译插件(TranslateBao)作为练手,开发细节不详述了,如果有新学习chrome extension开发的新人,可以参考源码, ...
最新文章
- 一套即时通讯聊天程序源码 VUE写的
- python网络爬虫学习笔记(一):网页基础
- FreeBSD6.1学习笔记[转]
- 编译原理 - SLR(1)
- Silverlight的依赖属性与附加属性(六)
- 金蝶KIS专业版V14.1生产任务单|销售单等单据图片打印
- PS魔棒工具的使用方法
- 技术笔记:.Net全套就业班视频教程——数据库
- 【数据挖掘算法竞赛】山东省-公积金贷款逾期预测TOP8 baseline523
- 论文阅读:Reasoning about Object Affordances in a Knowledge Base Representation
- 阿里小蜜商家版投入测试 为商家服务扩容
- [暑假]简单认识一下常用的字体 <<微软雅黑 黑体 和 宋体>>
- 电子书产品日趋丰富,科大讯飞智能办公本仍是理想之选
- Pycharm 小技巧-- filewacher+black自动格式化
- 机器学习实战---PM2.5预测
- 疲惫!很疲惫(发发牢骚)
- mysql stdistance_C#开发SQLServer的Geometry和Geography存储
- Blender齿轮制作
- 3B大战续集,你亲谁?
- 这些算法可视化网站助你轻松学算法