【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列
dp好题?
第一问
第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列.
\(n-ans\)就是最终的答案.
第二问
好难啊.不会.挖坑待补.
考虑一下对于一个i~j的可能符合情况,定然存在一个\(k\)在i~k之中为\(a_i\),k~j之中为\(a_j\).
然后就可以dp了.
这个转移比较玄学.如果不随机就GG了.

代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi()
{
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=50010;
int a[N],n,L,cnt,mn[N],f[N],front[N],to[N<<2],nxt[N<<2];
ll g[N],s1[N],s2[N];
int find(int x){
int l=1,r=L,t=0;
while(l<=r){
int mid=(l+r)>>1;
if(mn[mid]<=x)t=mid,l=mid+1;
else r=mid-1;
}
return t;
}
void dp(){
memset(mn,127,sizeof(mn));
mn[0]=-(1<<30);
for(int i=1;i<=n;i++){
int q=find(a[i]);
f[i]=q+1;
L=max(L,f[i]);
mn[q+1]=min(mn[q+1],a[i]);
}
}
void Add(int u,int v){
to[++cnt]=v;nxt[cnt]=front[u];front[u]=cnt;
}
void solve(){
for(int i=n;~i;i--){
Add(f[i],i);
g[i]=1ll<<60;
}
g[0]=0;a[0]=-(1<<30);
for(int u=1;u<=n;u++)
for(int i=front[f[u]-1];i;i=nxt[i]){
int v=to[i];
if(v>u)break;
if(a[v]>a[u])continue;
for(int j=v;j<=u;j++)s1[j]=abs(a[v]-a[j]),s2[j]=abs(a[u]-a[j]);
for(int j=v+1;j<=u;j++)
s1[j]+=s1[j-1],s2[j]+=s2[j-1];
for(int j=v;j<u;j++)
g[u]=min(g[u],g[v]+s1[j]-s1[v]+s2[u]-s2[j]);
}
}
int main(){
n=gi();
for(int i=1;i<=n;i++)a[i]=gi()-i;
a[++n]=1<<30;
dp();solve();
printf("%d\n%lld\n",n-f[n],g[n]);
return 0;
}
【BZOJ1049】 [HAOI2006]数字序列的更多相关文章
- BZOJ1049 [HAOI2006]数字序列0
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ1049:[HAOI2006]数字序列(DP)
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...
- 洛谷P2501 bzoj1049 [HAOI2006]数字序列
题目链接 bzoj 洛谷 题解 第一问: 假如 \(i < j\) 如果 \(j\)能从\(i\)转移过来 显然中间空隙必须足够 例如:\(50\) \(53\) \(53\) \(52\) 就 ...
- BZOJ1049: [HAOI2006]数字序列
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题解: ydc的题解:http://pan.baidu.com/share/link?u ...
- bzoj 1049 [HAOI2006]数字序列
[bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
- 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)
1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
- 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)
2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...
- 【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS
很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目. 第一问:求最少改变几个数能把一个随机序列变成单调上升序列. \(Solution:\)似乎是一个结论?如果两个数\(A_i\) ...
随机推荐
- 2017/2/24:Maven的pom jar war的区别
首先,Run ——> Edit Configurations,这时候如下图: 然后点击左上角的加号,可以添加一个新的配置,如下图: 选择Maven,如下图: 下面填上自己的配置信息,点击appl ...
- ManageEngine OMP帮助台委派
- C++中栈和队列的基本操作
栈操作: s.push(item) // 将item压入栈中 s.pop() // 删除栈顶元素,不返回值 s.top() // 读取栈顶元素,返回 ...
- 修改oralce数据库用户名和密码
首先以sys用户登录数据库 一.修改用户名 查到到所需修改用户名称的用户需要:select user#,name from user$;(例如查到有一个normal的用户对应的user#=61) 修改 ...
- 清理docker大日志文件
1.进入容器文件的存放目录 ,并查看某一个容器的文件大小 [root@auto ~]# [root@auto ~]# cd /var/lib/docker/containers [root@auto ...
- #微码分享#AES算法的C++包装类
AES为Advanced Encryption Standard的缩写,中文名:高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替代DES.基于std:: ...
- 深入浅出javascript(三)封装和继承
一.私有变量和公有变量 通过var修饰的是私有变量. 二.私有变量的访问方法 三.特权.公有和私有方法 一个例子: function f(name) { var name=name; //私有变量 t ...
- Docker网络简介
Docker允许通过外部访问容器或则容器互联的方式来提供网络服务. 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或则-P参数来指定断开映射.当使用 -P 标记时, ...
- JS高程研读记录一【事件流】
事件流主要有冒泡事件.事件捕获及DOM事件流.现浏览器除了IE8及更早版外,基本支持DOM事件流. 冒泡事件由IE提出,而事件捕获则由Netscape提出.但两者却是截然相反的方案. 以DIV点击为例 ...
- _编程语言_C++_std
正常使用 cout << "Count is "<<i<<endl; 含有std std::cout << "Count ...