博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1049: [HAOI2006]数字序列
阅读量:5220 次
发布时间:2019-06-14

本文共 1874 字,大约阅读时间需要 6 分钟。

Description

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

但是不希望改变过多的数,也不希望改变的幅度太大。

solution

正解:DP

这题相当诡异.
首先是一个套路,转化严格递增为不降,我们只需要把序列中的每一个元素都变为 \(a[i]-i\),设新数组为 \(b[i]\).
我们要改变的尽量少,就要使得不改变的尽量多,设 \(f[i]\) 表示前\(i\)个已经改变好,不改变数的最小值.
原数组 \(a[i]\) 的话,转移为 \(f[i]=Max(f[j]+1)\),需要满足 \(a[i]-a[j]>=i-j\).
对于新数组,我们只需要满足不降即可,所以 \(b[j]<=b[i]\),那么第一问我们可以转化为最长不降子序列,\(O(nlogn)\) 可以求出

对于第二问,我们设 \(g[i]\) 表示前\(i\)已经处理好的最小费用,\(g[i]=g[j]+w[j+1][i]\)\(j\) 满足 \(f[i]=f[j]+1\),我们可以挂链转移

我们需要猜一个结论:\(w[j][i]\) 的最优情况一定是存在一个 \(k\) \(i<k<j\) 使得 \(j-k\) 全部变为 \(b[j]\)\(i-k\)全部变为 \(b[i]\).
可以感性证明:前面的要选的位置尽量低,因为如果前面的选的很高,那么后面的一堆都要变化这么多,显然不会更优.
我们枚举断点转移即可,复杂度 \(O(n^3)\) 但是随机数据下跑得过,十分玄学

#include 
#include
#include
#include
#include
#include
#define RG register#define il inline#define iter iterator#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;typedef long long ll;const int N=35005;const ll inf=2e16;ll a[N];int n,f[N];ll h[N];ll g[N],s1[N],s2[N];il int midit(RG int l,RG int r,ll x){ RG int mid,ret=0; while(l<=r){ mid=(l+r)>>1; if(h[mid]<=x)ret=mid,l=mid+1; else r=mid-1; } return ret;}void solve1(){ int t; a[++n]=1<<30; for(int i=1;i<=n;i++)h[i]=2e9+10; h[1]=a[1];f[1]=1; for(int i=2;i<=n;i++){ t=midit(1,n,a[i]); f[i]=t+1; h[f[i]]=Min(h[f[i]],a[i]); } printf("%d\n",n-f[n]);}int num=0,head[N],to[N],nxt[N];il void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}void solve2(){ for(int i=n;i>=0;i--)link(f[i],i),g[i]=inf; g[0]=0;a[0]=-a[n]; for(int i=1;i<=n;i++){ for(int l=head[f[i]-1];l;l=nxt[l]){ int j=to[l];if(j>i)break; if(a[j]>a[i])continue; for(int k=j;k<=i;k++){ s1[k]=abs(a[j]-a[k]); s2[k]=abs(a[i]-a[k]); } for(int k=j+1;k<=i;k++) s1[k]+=s1[k-1],s2[k]+=s2[k-1]; for(int k=j;k

转载于:https://www.cnblogs.com/Hxymmm/p/7751595.html

你可能感兴趣的文章
排序算法(转)
查看>>
windows自带的可生成各种数据库连接字符串工具打开方法
查看>>
Python命名规范
查看>>
滚动条
查看>>
程序员的自我修养九Windows下的动态链接
查看>>
Codeforces Round #361 (Div. 2)
查看>>
细说WebSocket - Node篇
查看>>
[洛谷1485] 火枪打怪
查看>>
Extjs控件之 grid打印功能
查看>>
枚举类型(不常用)递归
查看>>
minggw 安装
查看>>
Jquery操作cookie,实现简单的记住用户名的操作
查看>>
[BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树
查看>>
【原创】大数据基础之Zookeeper(4)应用场景
查看>>
静态变量数组实现LRU算法
查看>>
中文系统 上传file的input显示英文
查看>>
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>