[HAOI2006]数字序列
题目描述
现在我们有一个长度为n的整数序列A。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。
输入输出格式
输入格式:
第一行包含一个数n,接下来n个整数按顺序描述每一项的键值。
输出格式:
第一行一个整数表示最少需要改变多少个数。
第二行一个整数,表示在改变的数最少的情况下,每个数改变的绝对值之和的最小值。
输入输出样例
说明
【数据范围】
90%的数据n<=6000。
100%的数据n<=35000。
保证所有数列是随机的。
一份讲解的链接
先将数组每一位a[i]减i
这样单调上升就变成了不下降
在给第n+1位加一个正无穷的值(可以做所有子串的结尾,用于统计第2问的答案)
第一问:求最长不下降串长L
答案就是n-L
第二问:首先令f[i]表示1~i的最长不下降长度,g[i]为将1~i变为不下降的代价
对于一对(i,j)且f[i]=f[j]+1
设w(i,j)为将j+1~i变为单调不下降的最小代价
有一个结论:
找到一个断点k
j+1~k全部变成a[j],k+1~i全部变成a[i]
这样一定可以找到这个最小代价
证明见链接
这个复杂度很玄学,最坏O(n^3),但数据是随机的,所以远远达不到
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
struct Node
{
int next,to;
}edge[];
int L,n,head[],num,Min[],a[];
lol s1[],s2[],g[],f[];
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
int find(int x)
{
int l=,r=L,as=;
while (l<=r)
{
int mid=(l+r)/;
if (Min[mid]<=x) as=mid,l=mid+;
else r=mid-;
}
return as;
}
int main()
{int i,j,k;
cin>>n;
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]-=i;
}
++n;
a[n]=(<<);
memset(Min,,sizeof(Min));
Min[]=-<<;L=;
for (i=;i<=n;i++)
{
int t=find(a[i]);
f[i]=t+;
L=max(L,t+);
Min[t+]=min(Min[t+],a[i]);
}
cout<<n-L<<endl;
for (i=n;i>=;i--)
{
add(f[i],i);
g[i]=1ll<<;
}
a[]=-<<;g[]=;
for (i=;i<=n;i++)
{
for (j=head[f[i]-];j;j=edge[j].next)
{
int v=edge[j].to;
if (v>i) break;
if (a[v]>a[i]) continue;
for (k=v;k<=i;k++)
s1[k]=abs(a[k]-a[v]),s2[k]=abs(a[k]-a[i]);
for (k=v+;k<=i;k++)
s1[k]+=s1[k-],s2[k]+=s2[k-];
for (k=v;k<i;k++)
g[i]=min(g[i],g[v]+s1[k]-s1[v]+s2[i]-s2[k]);
}
}
cout<<g[n];
}
[HAOI2006]数字序列的更多相关文章
- 【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...
- 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)
1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
- bzoj 1049 [HAOI2006]数字序列
[bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
- 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)
2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...
- BZOJ1049 [HAOI2006]数字序列0
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...
- 1049: [HAOI2006]数字序列 - BZOJ
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大.Input 第一行包含一个数n ...
- BZOJ1049:[HAOI2006]数字序列(DP)
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...
随机推荐
- Spring MVC之适配器的获取及执行(RequestMappingHandlerAdapter)
首先看下doDispatch()方法如何找到适合的适配器来执行方法的: protected HandlerAdapter getHandlerAdapter(Object handler) throw ...
- 使用linux下的crontab定时任务跑定时脚本
使用linux下的crontab定时任务跑定时脚本 tags:定时任务 定时脚本 crontab linux定时脚本 linux 引言:应该有许多人曾经很好奇一些定时脚本是怎么做出来的.我们这次就来说 ...
- 201621123040《Java程序设计》第十周学习总结
1.本周学习总结 2.书面作业 2.1常用异常 2.1.1自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 算术异常ArithmeticException(除数为0的情况) 类 ...
- Java作业-集合
1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { r ...
- zookeeper 启动失败 BindException: Address already in use 或者Error contacting service. It is probably not running
平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6 hadoop 1.2.1 今天上午装storm的时候遇到这个问题,好郁闷.把网上介绍的方法 ...
- Linux下关闭Tomcat残留线程
ps -ef | grep tomcat kill -9 {pid}
- 【作业】HansBug的前三次OO作业分析与小结
OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...
- Binary Tree Xorder Traversal
 * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeN ...
- hadoop基础教程免费分享
提起Hadoop相信大家还是很陌生的,但大数据呢?大数据可是红遍每一个角落,大数据的到来为我们社会带来三方面变革:思维变革.商业变革.管理变革,各行业将大数据纳入企业日常配置已成必然之势.阿里巴巴创办 ...
- C语言Linix服务器网络爬虫项目(二)项目设计和通过一个http请求抓取网页的简单实现
我们通过上一篇了解了爬虫具体要实现的工作之后,我们分析得出的网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出 ...