BZOJ 1049 数字序列
Description
现在我们有一个长度为n的整数序列A。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。
Input
第一行包含一个数n,接下来n个整数按顺序描述每一项的键值。
Output
第一行一个整数表示最少需要改变多少个数。 第二行一个整数,表示在改变的数最少的情况下,每个数改变的绝对值之和的最小值。
Sample Input
5 2 3 5
Sample Output
4
HINT
【数据范围】
90%的数据n<=6000。
100%的数据n<=35000。
保证所有数列是随机的。
Source
这道题感觉太神了。
令原数组为a。
对于第一问我们可以反过来思考——要求最少的改动的,不就是求最多的不改动的吗?
f[i]表示前i位最多的不改动的数字个数,f[i]=max(f[j]+1),j需要满足a[i]-a[j]≥i-j。对于条件,我们移一下项,化为a[i]-i≥a[j]-j,令b[i]=a[i]-i,不就是b[i]≥b[j]。细心的朋友一定看出来了,这不就是最长不下降子序列吗!!!O(nlogn)的求法上起。
第二问稍微麻烦一点,我们要知道一个结论:另g[i]表示前i个数,在改动数最少的前提下,最少改动的值。
那么对于所有合法的转移i,j(i>j,f[i]=f[j]+1,b[i]≥b[j]),最优解一定是在i与j之间某个k,k到j的值全为b[j],k+1到i的值全为b[i]。因此就可以dp了。证明自己脑补一下就可以了。。。(自己画画图,根据条件想想应该是可以明白的)
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; #define inf (1<<30)
#define maxn 35010
int tree[maxn],tot,n,f[maxn],a[maxn],bac[maxn];
long long g[maxn],s1[maxn],s2[maxn];
vector <int> vec[maxn]; inline int lowbit(int x) { return x & -x; } inline void change(int a,int b) { for (;a <= tot;a += lowbit(a)) tree[a] = max(tree[a],b); } inline int calc(int a) { int ret = ; for (;a;a -= lowbit(a)) ret = max(ret,tree[a]); return ret; } int main()
{
freopen("1049.in","r",stdin);
freopen("1049.out","w",stdout);
scanf("%d",&n);
for (int i = ;i <= n;++i) scanf("%d",a+i),a[i] -= i,bac[++tot] = a[i];
a[++n] = inf; bac[++tot] = a[n];
sort(bac+,bac+tot+); tot = unique(bac+,bac+tot+) - bac - ;
for (int i = ;i <= n;++i)
{
int pos = lower_bound(bac+,bac+tot+,a[i]) - bac;
f[i] = calc(pos) + ;
change(pos,f[i]);
}
printf("%d\n",n-f[n]);
for (int i = ;i <= n;++i) vec[f[i]].push_back(i);
a[] = -inf;
memset(g,0x7,sizeof(g)); g[] = ;
for (int i = ;i <= n;++i)
{
int nn = vec[f[i] - ].size();
for (int p = ;p < nn;++p)
{
int j = vec[f[i]-][p];
if (j >= i) break; if (a[i] < a[j]) continue;
for (int k = j;k <= i;++k) s1[k]=abs(a[k]-a[j]),s2[k]=abs(a[k]-a[i]);
for (int k = j+;k <= i;++k) s1[k] += s1[k-],s2[k] += s2[k-];
for (int k = j;k < i;++k) g[i] = min(g[i],g[j]+s1[k]-s1[j]+s2[i]-s2[k]);
}
}
printf("%lld",g[n]);
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 1049 数字序列的更多相关文章
- BZOJ 1049 数字序列(LIS)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1049 题意:给出一个数列A,要求:(1)修改最少的数字使得数列严格递增:(2)在( ...
- bzoj 1049: 数字序列 dp
题目大意: 给定一个长度为n的整数序列.在改变的数最小的和改变的幅度最小的前提下把它变成一个单调严格上升的序列.求改变的最小的数和这个幅度. 题解: (貌似以前考试考过这道题) 其实这道题就是两道题拼 ...
- 【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.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
- 找出数组中最长的连续数字序列(JavaScript实现)
原始题目: 给定一个无序的整数序列, 找最长的连续数字序列. 例如: 给定[100, 4, 200, 1, 3, 2], 最长的连续数字序列是[1, 2, 3, 4]. 小菜给出的解法: functi ...
- 九度OJ 1544 数字序列区间最小值
题目地址:http://ac.jobdu.com/problem.php?pid=1544 题目描述: 给定一个数字序列,查询任意给定区间内数字的最小值. 输入: 输入包含多组测试用例,每组测试用例的 ...
- kaggle之数字序列预测
数字序列预测 Github地址 Kaggle地址 # -*- coding: UTF-8 -*- %matplotlib inline import pandas as pd import strin ...
- string 数字序列大小比较
string 数字序列大小比较 string.compare string a = "022"; string b="1"; 比较结果 '022' < ' ...
随机推荐
- 独立博客怎样申请谷歌Adsense
谷歌Adsense广告是眼下个人站长的主要赚钱途径之中的一个,首先是它相对诱人的单位价格,尽管谷歌中文广告相比英文广告单位价格有所折扣,但我的经验是仅仅要你的网页内容和广告keyword有较高的匹配性 ...
- System.Data.DbType 与其它DbType的映射关系
System.Data.DbType 与其它DbType的映射关系 有如下类型的映射对照: System.Data.SqlClient.SqlDbType System.Data.OleDb.OleD ...
- 在Eclipse中显示空格(space)和制表符(tab)
显示空格(space)和制表符(tab)设置: Window->Preferences->General->Editors->Text Editors->Show whi ...
- Java基础知识强化之集合框架笔记35:List练习之产生10个1~20之间的随机数(要求:随机数不能重复)
1. 需求:获取10个1-20之间的随机数,要求不能重复 用数组实现,但是数组的长度是固定的,长度不好确定.所以我们使用集合实现. 分析: • 创建产生随机数的对象 • 创建一个存储随机数的集合. • ...
- 各大浏览器CSS Hack收集
各大浏览器CSS Hack收集 >>>>>>>>>>>>>>>>>>>>> ...
- rabbitMQ实战(一)---------使用pika库实现hello world
rabbitMQ实战(一)---------使用pika库实现hello world 2016-05-18 23:29 本站整理 浏览(267) pika是RabbitMQ团队编写的官方Pyt ...
- table转list
DataTable数据集转换为List非泛型以及泛型方式 前言 DataTable是断开式的数据集合,所以一旦从数据库获取,就会在内存中创建一个数据的副本,以便使用.由于在实际项目中,经常会将 Dat ...
- Weex 样式
1.盒型 width height padding padding-left padding-right padding-top padding-bottom margin margin-left m ...
- angularjs modal 嵌套modal的问题
anguarjs中当遇到modal嵌套modal的时候,比如一个modal弹出啦一个modal1,关闭modal1后,modal本身的关闭功能失效,那么需要$modal来生命弹出的modal1并且关闭 ...
- HTTP could not register URL http://+:8000/.... Your process does not have access rights to this namespace
windows 7, Visual Studio 2013 在托管 Windows 服务中承载 WCF 服务时报错: HTTP could not register URL http://+:8000 ...