整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


BZOJ简单题合集x

目录

  • BZOJ 1592. Making the Grade
  • 拓展问题一
  • 拓展问题二
  • 拓展问题三

BZOJ 1592. Making the Grade

Weblink

https://hydro.ac/d/bzoj/p/1592

Problem


Solution

题目要求通过修改得到非严格单调递增或递减的序列,也就是说可以相等。所以这里有一个非常显然的结论:最少的修改次数得到非严格单调的序列,修改后的得到的数一定是原序列里的数。(因为可以相等,贪心的想一想,为什么)

那么显然我们可以设 f[i,j]f[i,j]f[i,j] 表示序列中第 iii 个数修改为原序列里第 jjj 个数的最少修改次数。

题目中序列可以为非严格单调递增或者非严格单调递减,所以我们将原序列复制为 bbb 数组,将 bbb 递增排序进行DP,然后递减排序进行DP取二者最小值即可。

显然有转移方程:

f[i,j]=min⁡{f[i−1,k]+abs(a[i]−b[j]),1≤k≤j}f[i,j]=\min\{f[i-1,k]+\text{abs}(a[i]-b[j]),1\le k\le j\} f[i,j]=min{f[i−1,k]+abs(a[i]−b[j]),1≤k≤j}

直接转移时间复杂度为 O(n3)O(n^3)O(n3),n≤2000n\le 2000n≤2000,考虑优化。

考虑经典优化:数据结构优化。

显然有:

f[i,j]=min⁡{f[i−1,k]+abs(a[i]−b[j]),1≤k≤j}f[i,j]=min⁡{min⁡{f[i−1,k],1≤k≤j}+abs(a[i]−b[j])}f[i,j]=\min\{f[i-1,k]+\text{abs}(a[i]-b[j]),1\le k\le j\}\\ f[i,j]=\min\{\min\{f[i-1,k],1\le k\le j\}+\text{abs}(a[i]-b[j])\} f[i,j]=min{f[i−1,k]+abs(a[i]−b[j]),1≤k≤j}f[i,j]=min{min{f[i−1,k],1≤k≤j}+abs(a[i]−b[j])}

即决策集合中的元素只增不减,我们就可以用一个数据结构来维护这个决策集合,也即维护 min⁡{f[i−1,k],1≤k≤j}\min\{f[i-1,k],1\le k\le j\}min{f[i−1,k],1≤k≤j} 即可。

这里显然使用一个变量维护即可。

我们维护 num=min⁡{f[i−1,k],1≤k≤j}\text{num}=\min\{f[i-1,k],1\le k\le j\}num=min{f[i−1,k],1≤k≤j},每次转移的时候直接取 num=min⁡{f[i,j],f[i−1,j]}\text{num}=\min\{f[i,j],f[i-1,j]\}num=min{f[i,j],f[i−1,j]},在DP转移的时候 f[i,j]f[i,j]f[i,j] 直接用 num\text{num}num 进行更新即可。

Code

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const int maxn = 2e3 + 6, maxm = 1e6 + 7, INF = 0x3f3f3f3f;int n, m, s, t;
int a[maxn], b[maxn];
ll f[maxn][maxn];
ll ans;int main()
{ans = INF;scanf("%d", &n);for (int i = 1; i <= n; ++ i) {scanf("%d", &a[i]);b[i] = a[i];}memset(f, 0x3f, sizeof f);sort(b + 1, b + 1 + n);for (int j = 1; j <= n; ++ j)f[0][j] = 0;for (int i = 1; i <= n; ++ i) {ll num = INF;for (int j = 1; j <= n; ++ j) { num = min(num, f[i - 1][j]);f[i][j] = min(f[i][j], num + abs(a[i] - b[j]));}}for (int j = 1; j <= n; ++ j)ans = min(ans, f[n][j]);memset(f, 0x3f, sizeof f); reverse(b + 1, b + 1 + n);for (int i = 1; i <= n; ++ i) {ll num = INF;for (int j = 1; j <= n; ++ j) {num = min(num, f[i - 1][j]);f[i][j] = min(f[i][j], num + abs(a[i] - b[j]));}}for (int j = 1; j <= n; ++ j)ans = min(ans, f[n][j]);cout << ans << endl;return 0;
}

拓展问题一

拓展问题一:给定长度为 nnn 的整数序列 aaa ,求最少修改次数(修改操作可以任意修改数值),使得 aaa 非严格单调递增。(保证序列任意时刻均为整数)

Solution

显然问题的答案为 n−LISn-LISn−LIS,即贪心地使得不需要修改的数尽可能的多。

拓展问题二

拓展问题二:给定长度为 nnn 的整数序列 aaa ,求最少修改次数(修改操作可以任意修改数值),使得 aaa 严格单调递增。(保证序列任意时刻均为整数)

Solution

同样考虑贪心策略,使得不需要修改的数尽可能的多。

显然对于任意的 j>ij>ij>i​​​ ,iii​​​ 和 jjj​​ 可以保留当且仅当
a[j]>a[i]anda[j]−a[i]≥j−ia[j]>a[i]\ \mathrm{and}\ a[j]-a[i]\ge j-i a[j]>a[i] and a[j]−a[i]≥j−i

也即

a[j]−j≥a[i]−ia[j]-j \ge a[i]-i a[j]−j≥a[i]−i

因此我们让 a[i] = a[i] - i,问题就转化为了问题一,答案为 n−LISn-LISn−LIS​。

O(nlog⁡n)O(n\log n)O(nlogn) 求解新序列的 LISLISLIS 即可。

拓展问题三

Weblink

CF1437E Make It Increasing

Problem

给你一个数列 aaa,一个 kkk 个元素的集合 bbb ,对于每个 bbb 中的元素 xxx, axa_xax​ 不能修改,其他都可以修改,问最少多少次可以将 aaa 修改为严格单调递增的。如果不存在,输出 −1-1−1。

aaa 中的所有元素在任意时刻必须都是整数

1≤n≤5×105,1≤ai≤1091\le n\le5\times 10^5,1 \le a_i \le 10^91≤n≤5×105,1≤ai​≤109。

Solution

本题增加了一个新限制条件,即有 kkk 个点不能修改。

显然是没有什么用的,我们将序列分为 k+1k+1k+1 段,分别对每段计算答案即可(段内有序,段间有序)。

二分 O(nlog⁡n)O(n\log n)O(nlogn) 计算 LISLISLIS 即可。

Code

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const int maxn = 5e5 + 6, maxm = 1e6 + 7, INF = 0x3f3f3f3f;int n, m, s, t;
int a[maxn], b[maxn];
ll f[maxn];
ll ans;
vector<int> LIS;int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++ i) {int x;scanf("%d", &x);a[i] = x - i;}a[0] = -INF; a[n + 1] = INF;for (int i = 1; i <= m; ++ i)scanf("%d", &b[i]);b[0] = 0; b[m + 1] = n + 1;for (int i = 0; i <= m; ++ i) {int l = b[i], r = b[i + 1];if (a[l] > a[r]) return 0 * puts("-1"); LIS.clear();for (int j = l + 1; j <= r - 1; ++ j) {if (a[j] >= a[l] && a[j] <= a[r]) {auto pos = upper_bound(LIS.begin(), LIS.end(), a[j]);if (pos == LIS.end()) LIS.push_back(a[j]);else *pos = a[j];}}ans += (r - l - 1) - LIS.size(); }cout << ans << endl;return 0;
}

BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】相关推荐

  1. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  2. HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...

  3. Atcoder dp_q Flowers 数据结构优化dp

    文章目录 题意 题解 最近在练习atcoder上的dp场,大概只会做一半.我选出一些不会的题目写一下博客. 题意 按顺序每朵花有一个高度,一个美丽度,选出一个高度上升的子序列,求美丽度之和的最大值. ...

  4. 0x58 数据结构优化DP

    补写一下 poj3171 设f[i]表示覆盖L~i的最小花费,把区间按左端点排序,枚举区间,f[a[i].r]=min{f[a[i].l~(a[top].r-1)]}+a[i].c (当然还要和原值比 ...

  5. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 4142  Solved: 1964 [Submit][Sta ...

  6. AW297 赤壁之战(数据结构优化DP)

    题目地址 状态设计: f[子序列长度][当前位数](严格递增子序列数量). 易错点: 初始化时需要设置f[0][0]=1. 每个独立的数字都只会影响到比它更大的数字. 预处理时的sort保证了整个算法 ...

  7. bzoj1233 单调队列优化dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1233 数据结构优化dp的代码总是那么抽象 题意:奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Be ...

  8. dp进阶之FFT加速+数据结构优化+不等式优化

    快速傅里叶变换 快速傅里叶变换(英语:Fast Fourier Transform, FFT),是快速计算序列的离散傅里叶变换(DFT)或其逆变换的方法.傅里叶分析将信号从原始域(通常是时间或空间)转 ...

  9. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

    正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...

最新文章

  1. jdb java_JDB - 介绍
  2. 计科专业大一学生一枚,如何提高编程能力?
  3. 小程序云开发搜索功能的实现正则_几行代码实现小程序云开发提现功能
  4. docker 容器重命名
  5. 面试官系统精讲Java源码及大厂真题 - 41 突破难点:如何看 Lambda 源码
  6. 计算机或移动设备如何连接网络,移动cmcc电脑和手机使用方法
  7. Android Service 播放音乐
  8. 阿里巴巴又一开源项目被列入 CNCF 云原生全景图
  9. 程序包androidx.support.annotation不存在/import androidx.v7.app.AppCompatActivity;报错
  10. 学习笔记20 热传导方程
  11. 干货分享 | 4万字全面解读数据中台、数据仓库、数据湖(建议收藏)
  12. 谷歌官方Android镜像下载(中文站)
  13. 想要改变客户态度 这些销售话术需掌握
  14. java 月份缩写_关于java:如何将日期字符串解析为Date?
  15. 关于Node里面的pause和pauseSchedulerAndActions
  16. Java实现 蓝桥杯 算法提高 快乐司机
  17. VMware 虚拟机的三种网络连接方式
  18. 2020身高体重标准表儿童_儿童身高体重对照表下载-2020儿童身高体重标准表最新版高清版 - 极光下载站...
  19. discuz!x2主题分表、帖子分表功能分析
  20. 基金训练营学习笔记7-止盈

热门文章

  1. 最新!字节跳动再次扩招1000人,招聘要求令人窒息
  2. 你知道怎么使用OpenCV检测篮球运动员吗?
  3. 都在抢论文第一作者,怎么解决?
  4. LongAdder解析
  5. 第十一周作业关于json
  6. 类选择器和所作用的标签一起写为什么不起作用? - CSDN博客
  7. 《编写可维护的JavaScript》——1.7 直接量
  8. 异步获取邮件推送结果
  9. OCP读书笔记(10) - 使用闪回技术I
  10. extjs video