【bzoj1049】[HAOI2006]数字序列

Description

现在我们有一个长度为n的整数序列A。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。

Input

第一行包含一个数n,接下来n个整数按顺序描述每一项的键值。

Output

第一行一个整数表示最少需要改变多少个数。 第二行一个整数,表示在改变的数最少的情况下,每个数改变的绝对值之和的最小值。

Sample Input

4
5 2 3 5

Sample Output

1
4

HINT

【数据范围】

90%的数据n<=6000。

100%的数据n<=35000。

保证所有数列是随机的。

这是证明:

http://pan.baidu.com/share/link?uk=2651016602&shareid=1490516411

题解:

    这道题目第一问是十分简单,但是我wrong了好久。

    第二问是变化幅度。

    对于第一问,因为a[i]-a[j]>=i-j

    所以(a[i]-i)-(a[j]-j)>=0

    所以可以设b[i]=a[i]-i

    所以只需要b[i]-b[j]>=0即可

    fz[i]表示当前这个点到i这个点为结尾的最大长度。

    g[i]表示1-i之间的答案。

    g[i]=min g[j]+w[j+1,i],转移条件是fz[j]+1=fz[i]

    有一个结论,在j-i中会有一个t,使得j--t都是b[j],t+1--i都是b[i],

    然后就是暴力即可。

 #include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector> #define ll long long
#define N 350007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>='')
{
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
return x*f;
} int n;
ll g[N],s1[N],s2[N];
int a[N],b[N],num,f[N],fz[N];
vector<int>ve[N]; void mid_find(int x,int i)
{
int l=,r=num;
while(l<r)
{
int mid=(l+r)>>;
if (f[mid]<=x) l=mid+;
else r=mid;
}
if (f[r]<=x) f[++num]=x,fz[i]=num;
else f[r]=x,fz[i]=r;
}
void solve_lis()
{
for (int i=;i<=n;i++)
{
b[i]=a[i]-i,g[i]=(1LL<<);
mid_find(b[i],i);
//fz[i]=num;
ve[fz[i]].push_back(i);
}
printf("%d\n",n-fz[n]);
}
void solve()
{
b[]=-(<<);ve[].push_back();
for (int i=;i<=n;i++)
{
for (int j=;j<ve[fz[i]-].size();j++)
{
int pst=ve[fz[i]-][j];
if (b[pst]>b[i]) continue;
for (int k=pst;k<=i;k++)
s1[k]=abs(b[k]-b[pst]),s2[k]=abs(b[k]-b[i]);
for (int k=pst+;k<=i;k++)
s1[k]+=s1[k-],s2[k]+=s2[k-];
for (int k=pst;k<i;k++)
g[i]=min(g[i],g[pst]+s1[k]-s1[pst]+s2[i]-s2[k]);
}
}
printf("%lld",g[n]);
}
int main()
{
n=read();for (int i=;i<=n;i++) a[i]=read();a[++n]=(<<);
solve_lis();
solve();
}

bzoj 1049 [HAOI2006]数字序列的更多相关文章

  1. bzoj 1049: [HAOI2006]数字序列【dp+二分+瞎搞】

    第一问明显就是用b[i]=a[i]-i来做最长不下降子序列 然后第二问,对于一对f[i]=f[j]+1的(i,j),中间的数一定要改的,并且是等于b[i]或者b[j],我不会证,然后因为是随机数据,所 ...

  2. 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)

    1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...

  3. 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...

  4. 1049: [HAOI2006]数字序列 - BZOJ

    Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大.Input 第一行包含一个数n ...

  5. 【BZOJ1049】 [HAOI2006]数字序列

    BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...

  6. 洛谷 P2501 [HAOI2006]数字序列 解题报告

    P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...

  7. 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)

    2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...

  8. 洛谷P2501 bzoj1049 [HAOI2006]数字序列

    题目链接 bzoj 洛谷 题解 第一问: 假如 \(i < j\) 如果 \(j\)能从\(i\)转移过来 显然中间空隙必须足够 例如:\(50\) \(53\) \(53\) \(52\) 就 ...

  9. BZOJ1049 [HAOI2006]数字序列0

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

随机推荐

  1. java getDocumentBase() 得到的文件夹路径

    参考一个百度知道上的回答 举例说来,假设你的项目文件是xx,而这个xx文件夹是在D盘下的yy文件夹里,即项目文件的完整路径D:\yy\xx,则编译运行文件后,在xx文件夹里会产生名为build的文件夹 ...

  2. 关于表单清空的细节(reset函数或者class="reset"属性)

    在需要清空的表单的情况下, 如果是在页面中 那么就添加属性 class="reset"  也即是 <button class="reset" value= ...

  3. html5表单新增元素与属性2

    1.标签的control属性 在html5中,可以在标签内部放置一个表单元素,并且通过该标签的control属性来访问该表单元素. <script> function setValue() ...

  4. [BZOJ1083][SCOI2005]繁忙的都市 最小生成树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1083 由kruskal算法原理可知,我们对一张无向图做普通的最小生成树,连上的最后一条边就 ...

  5. linux centos7 tomcat8 配置成服务启动

    1. tomact 解压到/usr/local/tomcat下 2.vim /usr/local/tomcat/bin/catalina.sh 在OS specific support.前加上 (注意 ...

  6. vue2.0 组件化

    简单理解其实组件就是制作自定义的标签,这些标签在HTML中是没有的. 组件注册的是一个标签,而指令注册的是已有标签里的一个属性.在实际开发中我们还是用组件比较多,指令用的比较少. <!DOCTY ...

  7. WebSocket 的一些简单页面推送使用

    因为做通信项目的时候,需要实时获取每个分机的当前状态,发现websocket还不错,只是对浏览器的要求比较高, 针对特定用户推送消息,网上有一些 public class GetHttpSession ...

  8. 洛谷 P1615 西游记公司

    题目背景 一道极其无厘头的题目 题目描述 事情是这样的:西游记中的孙沙猪(孙杀猪)三徒弟在西天取经之后开始进入厦门大学经贸系学习经济,在1个小时的学习后,他们用暴力手段毕业了.然后,他们创办了三个公司 ...

  9. Windows 8.1设置WIFI共享以及无法启动承载链接解决方案.

    1.设置WIFI共享方法 2.无法启动承载链接解决方案 1.设置WIFI共享方法 Windows8 windows8.1笔记本wifi热点 wifi共享.快速将笔记本或者台式机的网络共享给手机,平板等 ...

  10. (转)Nutz | Nutz项目整合Spring实战

    http://blog.csdn.net/evan_leung/article/details/54767143 Nutz项目整合Spring实战 前言 Github地址 背景 实现步骤 加入spri ...