P2501 [HAOI2006] 数字序列

news/2024/11/14 23:06:57/文章来源:https://www.cnblogs.com/chhh31/p/18547036

[题目链接]([P2501 HAOI2006] 数字序列 - 洛谷 | 计算机科学教育新生态)

首先是第一问,直接求不好求,我们们考虑求不用更改的数量,发现有这个性质,如果,a[i] - a[j] < abs(j - i)两个数的差值能满足他们之间有足够多数的情况,例如1 4 5 3,取1 和 3,那么就有2 < 3, 中间的4 和 5 怎么改也不会单调上升

所以, 经过移项得a[i] - i < a[j] - j 即可,这就具有了,求最长的上升a[i] - i 即可,用b数组存下来是求最大上身子序列

这是第一问

第二问我们假如以i为最后一位的子序列的前一个状态时pre[i] 我们要把之间的数全都修改一遍,那就得让左边某一部分等于b[from],另一部分等于b[i],枚举这个分区即可求得从from到i这区间变为单调递增的最小花费,总花费加上from之前的就行

// Problem: P2501 [HAOI2006] 数字序列
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2501
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)//by codeforcer ——
//  ____  _   _  _   _  _   _   ____    _ 
// / ___|| | | || | | || | | | |___  \ | |
//| |    | |_| || |_| || |_| |   __) | | |
//| |    |  _  ||  _  ||  _  |  |__  < | |
//| |___ | | | || | | || | | |  ___) | | |
// \____||_| |_||_| |_||_| |_| |____ / |_|#include<bits/stdc++.h>
using namespace std;typedef int E;
typedef long long LL;
typedef pair<int, int> PII;
typedef tuple<int, int, int> PIII;
typedef tuple<LL, LL, LL> PLLL;
typedef pair<long long, long long> PLL;
typedef unsigned long long ULL;#define endl '\n'
#define vec vector
#define pb push_back
#define pob pop_back
#define fir first
#define sec second
#define maxINT 0x3f3f3f3f
#define maxLL 0x3f3f3f3f3f3f3f3fLL
#define umap unordered_map
#define uset unordered_set
#define maxheap priority_queue<E, vector<E>, less<E>>
#define minheap priority_queue<E, vector<E>, greater<E>>#define prvec(a)                			\for (int i = 0; i < (a).size(); i++) {	\cout << (a)[i] << " ";   			\}                            			\cout << endl;#define debugvec(a, i, n)             		\cout << #a << ": ";               		\for (int k = (i); k <= (n); k++) { 		\cout << (a)[k] << " ";        		\}                                 		\cout << endl;							LL gcd(LL a, LL b) { return (b) ? gcd(b, a % b) : a; }
LL exgcd(LL a, LL b, LL &x, LL &y) {if (b == 0) { x = 1, y = 0; return a; }LL gcd = exgcd(b, a % b, y, x);y -= a / b * x;return gcd;}
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;}const int N = 3e4 + 5e3;
long long top[N],f[N],g[N];
long long pre[N],sub[N],b[N];
vector<int> ed[N];void solve() {int n;cin>>n;vec<long long> a(n + 3);for(int i = 1;i <= n;i ++){cin>>a[i];b[i] = a[i] - i;}b[0] = -(1e9+2093),b[n + 1] = 1e9 + 2330;int cnt = 0;for(int i = 1;i <= n+1;i ++){int l = 0,r = cnt;while(l < r){int mid = (l + r + 1)>>1;if(top[mid] <= b[i]){l = mid;}else r = mid - 1;}if(l == cnt) cnt ++;f[i] = l + 1;top[l + 1] = b[i];ed[f[i]].pb(i);}ed[0].pb(0);memset(g,20,sizeof g);g[0] = 0;for(int i = 1;i <= n+1;i ++){for(int j = 0;j < ed[f[i] - 1].size();j ++){int from = ed[f[i] - 1][j];if(from > i || b[from] > b[i]) continue;pre[from] = sub[i - 1] = 0;for(int k = from + 1;k <= i - 1;k ++){pre[k] = pre[k - 1] + abs(b[k] - b[from]);}for(int k = i - 2;k >= from;k --){sub[k] = sub[k + 1] + abs(b[k + 1] - b[i]);}for(int k = from;k <= i - 1;k ++){g[i] = min(g[i],g[from] + pre[k] + sub[k]);}}   	}cout<<n - cnt+1<<endl<<g[n + 1]<<endl;}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833691.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux日志】web日志分析

WEB正确日志格式分析#日志统计举例[root@master ~]# cat /etc/httpd/logs/access_log |awk {print $1}#对IP排序[root@master ~]# cat /etc/httpd/logs/access_log |awk {print $1}|sort#打印每一个重复出现IP的次数,[root@master ~]# cat /etc/httpd/logs/access_log |awk {p…

SpringBoot配置多数据源实战

SpringBoot配置多数据源实战@目录SpringBoot配置多数据源实战需求来源:简单粗暴3步使用步骤:思路讲解:目录结构:使用注意点: SpringBoot配置多数据源实战 需求来源: 当相关业务场景想实现同时操作2个甚至多个不同数据库表的时候,就需要配置多个数据源。简单粗暴3步使用步…

HTTP 协议学习笔记

HTTP 协议学习笔记 带新手走进神秘的HTTP协议 - 超超boy - 博客园 HTTP 首部字段详细介绍 - 超超boy - 博客园 《白帽子讲 web 安全(第二版)》HTTP 默认的端口号为 80,HTTPS 的端口号为 443。HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管理。 可以使用 Coo…

自主研发RPA,基于uiautomatorviewer的自动化代码生成器,一键生成Java代码和Cucumber描述文件

介绍 基于UI Automator进行二次开发,让你不懂开发也能编写自动化测试代码, 一边生成代码一边Debug,毫不费力写出完美的自动化测试代码 。该工具集成了Tomcat使得添加新的功能的时候使用HTML+API进行开发,降低了开发难度;集成了Derby数据库,测试用例持久化到数据库。 软件…

关于NVIDIA Jetson AGX Xavier刷机过程记录

刷机记录,再刷机忘记了回来看看~主机电脑安装ubuntu20.04虚拟机,NVIDIA sdkmanager,主机端连上路由器提供的wifi。再将Jetson接上电源,但不开机。拿出附带的typec——USB数据线,typec端连上图中的typec口,USB连上主机电脑。找出一根网线,一端连接Jetson,另一端连接步骤…

shell编程 - 基础篇

1. Shell简介Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。2. Shell编程语言必知必会shell命令解释器:bash编程常用命令解释器.命令解释器bash 目前应用最广泛一…

第四届光学与机器视觉国际学术会议(ICOMV 2025) 2025 4th International Conference on Optics and Machine Vision

第四届光学与机器视觉国际学术会议(ICOMV 2025)2025 4th International Conference on Optics and Machine Vision重要信息官网:https://ais.cn/u/vEbMBz

【os】操作系统是怎样一步步接收键盘按键的?

你有没有想过,按下键盘按键后,相应的字符是怎么一步步显示在屏幕上的? 首先来看硬件部分,你至少应该能想到必须得有键盘和CPU:之后呢,cpu是怎么知道有键盘按下呢? 为了让键盘按下按键后能通知到CPU,需要借助键盘控制器,keyboard controller,这当然也是硬件:当按下按…

Kafka学习day01

Kafka的学习day01-Kafka基础环境的搭建Kafka Centos7环境搭建 1. 安装Zookeeper 1.1 官网下载安装包ZooKeeper官网下载地址1.2 使用Xftp或远程工具将ZooKeeper安装包上传文件到服务器或虚拟机1.3 编写配置文件 进入ZooKeeper安装目录 cd {安装目录}/conf/1.3.1 配置文件模版 # …

从数据到知识,知识中台赋能企业智能化升级

在信息爆炸的时代,企业面临着数据泛滥与知识匮乏的双重挑战。如何将海量的数据转化为有价值的知识,进而驱动企业的智能化升级,已成为企业竞争力的关键。知识中台作为企业数字化转型的核心,正逐渐成为企业智能化升级的新引擎。 一、数据与知识的转化 数据本身并不等同于知识…

基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现十

审核前台用户认证信息、查看所有用户、订单、发布文章、发布常见问题等。 该系统总共24张表,代码整洁,每个功能、接口上都有注释说明。 运行环境:jdk1.8、mysql5.x、eclipse/idea、maven3.5/3.6 包远程运行的哦。 特色功能:发布课程、学习课程、分享资料、资料讨论等。 部分…

基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现九

该系统总共24张表,代码整洁,每个功能、接口上都有注释说明。 运行环境:jdk1.8、mysql5.x、eclipse/idea、maven3.5/3.6 包远程运行的哦。 特色功能:发布课程、学习课程、分享资料、资料讨论等。 部分功能:前台课程评论信息控制器Controller、优惠卷信息控制器Controller、…