Luogu P2501 [HAOI2006]数字序列
题目
首先把\(a\)改成严格单调上升等于把\(a_i-i\)改成单调不降。
那么第一问可以直接做LIS,答案就是\(n-\)LIS的长度。
同时我们记录一下序列中每个位置结尾的LIS长度。
第二问我们考虑这样一个事实:
对于LIS中相邻的两个数\(a_i,a_j\),这两个数中间的数一定要么\(<a_i\)要么\(>a_j\)。
考虑一种修改方案,显然修改后中间的数会呈现阶梯状。
对于任意一个阶梯\((l,r,x)\),如果它上面的数(\([l,r]\)中\(>x\)的数)的个数大于下面的数的个数(\([l,r]\)中\(<x\)的数),那么我们把它往上移到下一个阶梯的高度一定会更优。
反之我们把它移到下一个阶梯的高度一定会更优。
如果上面和下面的数个数相等,我们随便怎么移动都不会改变这个代价。
因此最终我们一定可以把它移成两个阶梯\((i+1,k,a_i),(k+1,j,a_j)\)。
那么对于LIS中相邻的两数\(a_i,a_j\),最优的修改方案一定是找到某个\(k\),把\(a_{i+1}\sim a_k\)改成\(a_i\),把\(a_{k+1}\sim a_j\)改成\(a_j\)。
我们枚举这个\(k\)。然后计算。
注意到数据随机,所以LIS的期望长度为\(\log n\),因此复杂度正确。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N=35007,inf=0x3f3f3f3f;
int read(){int x=0,c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;}
ll min(ll a,ll b){return a<b? a:b;}
int abs(int a){return a<0? -a:a;}
int a[N],num[N],f[N];ll g[N],s[N],t[N];vector<int>E[N];
int main()
{
int n=read(),i,k,l,len;
for(i=1;i<=n;++i) a[i]=read()-i;
a[++n]=inf,a[0]=-inf,memset(num,0x3f,sizeof num),num[0]=-inf,num[1]=a[1],f[1]=len=1,memset(g,0x3f,sizeof g),g[0]=0;
for(i=2;i<=n;++i) l=upper_bound(num,num+len+1,a[i])-num,len=max(len,l),f[i]=l,num[l]=min(num[l],a[i]);
for(i=0;i<=n;++i) E[f[i]].pb(i);
for(i=1;i<=n;++i)
for(int j:E[f[i]-1])
{
if(j>i||a[j]>a[i]) continue;
for(k=j;k<=i;++k) s[k]=abs(a[k]-a[j]),t[k]=abs(a[k]-a[i]);
for(k=j+1;k<=i;++k) s[k]+=s[k-1],t[k]+=t[k-1];
for(k=j;k<i;++k) g[i]=min(g[i],g[j]+s[k]-s[j]+t[i]-t[k]);
}
printf("%d\n%lld",n-f[n],g[n]);
}
Luogu P2501 [HAOI2006]数字序列的更多相关文章
- 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)
2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
- p2501 [HAOI2006]数字序列
传送门 分析 https://www.luogu.org/blog/FlierKing/solution-p2501 对于第二问的感性理解就是有上下两条线,一些点在上面的线的上面或者下面的线的下面,然 ...
- P2501 [HAOI2006]数字序列 (LIS,DP)(未完成)
第二问好迷... #include "Head.cpp" #include <vector> const int N = 35007; vector<int> ...
- 【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...
- 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)
1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...
- bzoj 1049 [HAOI2006]数字序列
[bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
- 【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS
很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目. 第一问:求最少改变几个数能把一个随机序列变成单调上升序列. \(Solution:\)似乎是一个结论?如果两个数\(A_i\) ...
- 洛谷P2501 bzoj1049 [HAOI2006]数字序列
题目链接 bzoj 洛谷 题解 第一问: 假如 \(i < j\) 如果 \(j\)能从\(i\)转移过来 显然中间空隙必须足够 例如:\(50\) \(53\) \(53\) \(52\) 就 ...
随机推荐
- jmeter csv Data Set Config 文件中带引号的数据转换问题(自动添加双引号解决办法)
1.我们从csv中获取数据,在jmeter中使用这些数据,其中csv的数据如图,有的数据包含引号. 2.问题:我们获取的json数据,被自动添加了双引号 3.解决方式: 在CSV Data Set C ...
- java正则表达式详细总结
Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...
- ORACLE ASM 日常管理
ASM概述 Automatic Storage Management(ASM)是Oracle数据库10g中一个非常出色的新特性,它以平台无关的方式提供了文件系统.逻辑卷管理器以及软件RAID等服务.A ...
- leetcode-easy-listnode-234 Palindrome Linked List
mycode 89.42% # Definition for singly-linked list. # class ListNode(object): # def __init__(self, ...
- java 中的多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态. 下面利用代码进行简单概述: 实现多态必须要满足三个条件 1必须有继承 2必须重写 3必须父类引用子类对象 ...
- Kotlin之注释
kotliin中注释和java注释是一样的,支持单行注释和多行注释,但kotlin支持嵌套,java不支持
- Appium+python--元素定位uiautomatorviewer
一.启动uiautomatorviewer.bat 1. 打开uiautomatorviewer软件,如下图所示,本机路径:E:\downloads\android-sdk_r23.0.2-windo ...
- Maximum Likelihood 最大似然估计
Maximum Likelihood 最大似然估计 这个算法解决的问题是,当我们知道一组变量的密度分布函数与从总体采样的个体的时候,需要估计函数中的某些变量. 假设概率密度函数如下: 一般来说,为了计 ...
- JS实战篇
实现选项卡的选择: 效果图如下: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- Professional JavaScript for Web Developers P224-P225
然后第二段代码执行过程中,有1个global variabe object,1个createFunction activation object,10个anonymous function1 acti ...