2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)
2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)
https://www.luogu.com.cn/problem/P2501
题意:
现在我们有一个长度为 n 的整数序列 a。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。
求最小的改变次数和此时每个数改变的绝对值之和。
分析:
对于 \(a_i\) ,\(a_j\) , \(i<j\) ,当 \(j-i<=a_j-a_i\) 时 \(i\) 与 \(j\) 这两项保留。移项得: \(a_i-i<=a_j-j\) ,则第一问转变为求 \(a_i-i\) 的最长不降子序列。在求出来的最长不降子序列中任意相邻两个元素之间的原序列 \(b_i\) 的元素均不在 \(b_k\) 到 \(b_{k+1}\) 中。任取原序列中的 \(k\) ,使 \(i<=k\) 且 \(k<=j\) ,\(suf\) 为从 \(k+1\) 开始到 \(j\) 之间修改的绝对值之和,这些数均被修改为 \(a_j\) , \(pre\) 为从 \(i\) 开始到 \(k\) 之间修改的绝对值之和,这些数均被修改为 \(a_i\) 。如果存在一个数 \(a_x\) ,且 \(a_x>a_j\) ,则这个数最大可被被修改为 \(a_j\) ,同理,如果存在一个数 \(a_y\) ,且 \(a_y<a_i\) ,那么把 \(a_y\) 修改成 \(a_i\) 更优。但是要保证原序列被修改后依旧是最长不降,所以一定存在某个点使 \(i\) 到 \(j\) 这个区间被分割后形成两层楼梯阶梯,使得修改的绝对值最小。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
const int N=4e4+10;
const int inf=0x3f3f3f3f;
int n,a[N],f[N],pre[N],suf[N],fin[N],top,len[N];
int cnt,head[N];
struct node{
int to,next;
}e[N];
inline void add(int u,int v){
++cnt;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
signed main(){
IOS;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],a[i]-=i;
a[0]=-inf;a[n+1]=inf;
for(int i=1;i<=n+1;i++){
int L=0,R=top;
while(L<R){
int mid=(L+R+1)>>1;
if(fin[mid]<=a[i])L=mid;
else R=mid-1;
}
if(L==top)++top;
len[i]=L+1;
fin[L+1]=a[i];
add(len[i],i);
}
add(0,0);
memset(f,inf,sizeof(f));
f[0]=0;
for(int i=1;i<=n+1;i++){
for(int j=head[len[i]-1];j;j=e[j].next){
int v=e[j].to;
if(v>i||a[v]>a[i])continue;
pre[v]=suf[i-1]=0;
for(int k=v+1;k<i;k++)pre[k]=pre[k-1]+abs(a[k]-a[v]);
for(int k=i-2;k>=v;k--)suf[k]=suf[k+1]+abs(a[k+1]-a[i]);
for(int k=v;k<i;k++)f[i]=min(f[i],f[v]+suf[k]+pre[k]);
}
}
cout<<n-top+1<<endl<<f[n+1];
return 0;
}
2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)的更多相关文章
- P2501 [HAOI2006]数字序列 (LIS,DP)(未完成)
第二问好迷... #include "Head.cpp" #include <vector> const int N = 35007; vector<int> ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
- 2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)
2021.12.06 P2511 [HAOI2008]木棍分割(动态规划) https://www.luogu.com.cn/problem/P2511 题意: 有n根木棍, 第i根木棍的长度为 \( ...
- 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)
1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...
- Luogu P2501 [HAOI2006]数字序列
题目 首先把\(a\)改成严格单调上升等于把\(a_i-i\)改成单调不降. 那么第一问可以直接做LIS,答案就是\(n-\)LIS的长度. 同时我们记录一下序列中每个位置结尾的LIS长度. 第二问我 ...
- p2501 [HAOI2006]数字序列
传送门 分析 https://www.luogu.org/blog/FlierKing/solution-p2501 对于第二问的感性理解就是有上下两条线,一些点在上面的线的上面或者下面的线的下面,然 ...
- 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...
- 【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...
- bzoj 1049 [HAOI2006]数字序列
[bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
随机推荐
- redis持久化 RDB与AOF
redis持久化 RDB与AOF RDB与AOF区别 rdb: 基于快照的持久化,速度更快,一般用做备份,主从复制也是依赖于rdb持久化功能 aof:以追加的方式记录redis操作日志的文件,可以最大 ...
- CodeUp Problem D: More is better
根据题目意思,输入的每一对A.B都是直接朋友,并且最后只会得到一个集合,该集合就是Mr Wang选择的男孩. 因此很容易写出代码,甚至不需要自己构建一个并查集,只需要使用C++的set模板,每次读入一 ...
- 什么?Android上面跑Linux?
前言 众所周知,现在程序员因为工作.个人兴趣等对各种系统的需求越来越大,部分人电脑做的还是双系统.其中,比较常见的有各种模拟器.虚拟机在windows上面跑Android.Linux,大家估计都习以为 ...
- Linux下面有7个运行等级 run level
Linux下面有7个运行等级 run level run level 0 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 run level 1 单用户工作状态,root权限,用于系 ...
- JavaScript this的理解
一直对js的this不怎么理解,最近看了JavaScript 语言精髓的相关章节,有点清晰的理解了,记录记录 /* 来自: JavaScript 语言精髓 方法:当一个函数被定义为对象的一个属性时,我 ...
- JVM知识(一) 求你了,别再说Java对象都是在堆内存上分配空间的了!
求你了,别再说Java对象都是在堆内存上分配空间的了! https://baijiahao.baidu.com/s?id=1661296872935371634&wfr=spider& ...
- 请说出作用域public,private,protected,以及不写时的区别?
这四个作用域的可见范围如下表所示.说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly.作用域 当前类 同一package 子孙类 其他packagepublic ...
- 学习zabbix(七)
zabbix自定义监控项 1.创建主机组,可以根据redis.mysql.web等创建对于的主机组 2.创建主机 3.创建Screens 4.自定义监控项 zabbix_agentd.conf配置文件 ...
- SaltStack项目实战(一)
系统架构图 一.初始化 1.salt环境配置,定义基础环境.生产环境(base.prod) ? 1 2 3 4 5 6 7 8 9 10 vim /etc/salt/master 修改file_r ...
- 【SpringBoot学习一】开发入门--快速创建springboot程序
前言 本片博客记录快速创建springboot工程的两种方式.一种是使用maven创建,一种是使用spring initializr创建.开发环境JDK1.8.IDEA.maven. SpringBo ...