bzoj 1049: 数字序列 dp
题目大意:
给定一个长度为n的整数序列.在改变的数最小的和改变的幅度最小的前提下把它变成一个单调严格上升的序列.求改变的最小的数和这个幅度。
题解:
(貌似以前考试考过这道题)
其实这道题就是两道题拼一块的
我们首先考虑第一问
这是一个经典模型,我们有
当有\(i - j \leq a_i - a_j\)\(a_i\)和\(a_j\)不用更改\((i > j)\)
所以我们变号得到\(a_j - j \leq a_i - i\)
所以我们将所有序列中的值减去下标再做一遍最长不下降子序列即可
然后我们使用减去了下标的那个数组作为第二问的初始数组
我们设\(f[i]\)为第一问的LCIS的dp数组,\(g[i]\)表示第二问的dp数组
(均表示1~i的答案)
我们有\(g[i] = min{g[j] + calc(j+1,i)}\text{当且仅当}(f[i] == f[j] + 1)\)
由...ydc的题解我们知道...
现在一个结论是,calc(j,i)的方案,一定会以某个k 为分界使得[j,k] 均为\(b_j\) 且\([k+1,i]\) 均为\(a_i\)
证明已跪...
所以我们利用这个性质统计答案即可
(很抱歉我连怎么用都不会,%了一发hzwer的代码)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline ll cat_max(const ll &a,const ll &b){return a>b ? a:b;}
inline ll cat_min(const ll &a,const ll &b){return a<b ? a:b;}
const ll maxn = 35010;
const ll inf1 = 1<<30;
const ll inf2 = 1LL<<60;
// inline ll abs(ll x){
// return x < 0 ? -x : x;
// }
struct Edge{
ll to,next;
}G[maxn];
ll head[maxn],cnt;
void add(ll u,ll v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
ll a[maxn],f[maxn],m[maxn],g[maxn];
ll lim;
inline ll find(ll x){
ll l = 1,r = lim,ret = 0;
while(l <= r){
ll mid = (l+r) >> 1;
if(m[mid] <= x) ret = mid,l = mid+1;
else r = mid - 1;
}return ret;
}
ll suma[maxn],sumb[maxn];
int main(){
memset(m,0x3f,sizeof m);
ll n;read(n);
for(ll i=1;i<=n;++i) read(a[i]),a[i] -= i;
a[++n] = inf1;m[0] = -inf1;
for(ll i=1;i<=n;++i){
f[i] = find(a[i]) + 1;
//printf("f[%d] = %d\n",i,f[i]);
lim = max(lim,f[i]);
m[f[i]] = min(a[i],m[f[i]]);
}
for(ll i = n;i>=0;--i) add(f[i],i),g[i] = 1LL<<60;
a[0] = -inf1;g[0] = 0;
#define v G[p].to
for(ll u = 1;u<=n;++u){
for(ll p = head[f[u]-1];p;p=G[p].next){
if(v > u) break;
if(a[v] > a[u]) continue;
suma[v-1] = sumb[v-1] = 0;
for(ll i=v;i<=u;++i){
suma[i] = suma[i-1] + abs(a[v] - a[i]);
sumb[i] = sumb[i-1] + abs(a[u] - a[i]);
}
for(ll i=v;i<=u;++i){
// printf("%d <- %d\n",g[u],g[v] + suma[i] - suma[v] + sumb[u] - sumb[i]);
g[u] = min(g[u],g[v] + suma[i] - suma[v] + sumb[u] - sumb[i]);
}
}
}
#undef v
printf("%lld\n%lld\n",n-f[n],g[n]);
getchar();getchar();
return 0;
}
bzoj 1049: 数字序列 dp的更多相关文章
- BZOJ 1049 数字序列
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个数 ...
- BZOJ 1049 数字序列(LIS)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1049 题意:给出一个数列A,要求:(1)修改最少的数字使得数列严格递增:(2)在( ...
- 【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS
很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目. 第一问:求最少改变几个数能把一个随机序列变成单调上升序列. \(Solution:\)似乎是一个结论?如果两个数\(A_i\) ...
- bzoj 4244 括号序列dp
将各种情况绕环等看作括号序列,括号内的区域上下都需要累加答案,左右也是 f[i][j] 代表 前i个车站已经处理完的有j个左括号的最小权值 我们可以发现,更新的来源来自于 i-1, 和 i 将上 描述 ...
- BZOJ1049:[HAOI2006]数字序列(DP)
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...
- 【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...
- 【BZOJ】【1049】【HAOI2006】数字序列
DP 第一问比较水……a[i]-=i 以后就变成最长不下降子序列问题了,第二问这个结论好神奇,考试的时候怎么破?大胆猜想,不用证明?TAT 题解:http://pan.baidu.com/share/ ...
- 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)
1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...
- bzoj 1049 [HAOI2006]数字序列
[bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
随机推荐
- ZIP解压缩文件的工具类【支持多级文件夹|全】
ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...
- 【转】Android中的Apk的加固(加壳)原理解析和实现
一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...
- ios -- 极光推送《1》
昨天公司项目要加入远程推送功能,自己做显然会很麻烦,所以用了极光的远程推送,下面我会讲如何制作推送证书并使用极光推送进行远程推送. 先讲讲怎么下载推送证书吧(前面的很简单要是知道的可以直接往下滑,简书 ...
- 视频服务之ffmpeg部署
FFmpeg介绍 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. 采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案. 它包含了非常先进 ...
- SQL ROW_NUMBER() 分页使用示例
ALTER PROC [dbo].[TestProPage] , AS BEGIN SELECT * FROM (SELECT *,ROW_NUMBER() OVER(ORDER BY IndexID ...
- 【BZOJ1124】[POI2008]枪战Maf 贪心+思路题
[BZOJ1124][POI2008]枪战Maf Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开 ...
- 80端口未被占用,apache无法启动,命令行运行httpd.exe提示文档内容有错
Apache无法启动,端口被占用的可能性比较大,所以建议大家还是先换端口试试,这个网上说的比较多,具体可参见http://www.cnblogs.com/zdan68/p/3855636.html. ...
- centos下更换默认的python版本
1.在命令行输入python查看版本 2.到官网下载自己的python版本 wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz ...
- 基于springboot的RestTemplate、okhttp和HttpClient对比
1.HttpClient:代码复杂,还得操心资源回收等.代码很复杂,冗余代码多,不建议直接使用. 2.RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, RestTem ...
- Linux-3.14.12内存管理笔记【kmalloc与kfree实现】【转】
本文转载自:http://blog.chinaunix.net/uid-26859697-id-5573776.html kmalloc()是基于slab/slob/slub分配分配算法上实现的,不少 ...