Problem Description
我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。
请输出最少需要修改多少个元素。
 
Input
第一行输入一个T(1≤T≤10),表示有多少组数据

每一组数据:

第一行输入一个N(1≤N≤105),表示数列的长度

第二行输入N个数A1,A2,...,An。

每一个数列中的元素都是正整数而且不超过106。

 
Output
对于每组数据,先输出一行

Case #i:

然后输出最少需要修改多少个元素。

 
Sample Input
2
2
1 10
3
2 5 4
 
Sample Output
Case #1: 0 Case #2: 1
 
解题思路:
  不难理解,求 a[i]-i 的最长非递减子序列长度 len ,然后 n-len 就是答案了;
  以下有两份代码;
  代码一:
    二分法,打模板即可;时间复杂度O(nlog(n))
  代码二:
    树状数组,前缀最大值的应用。 时间复杂度也是 O(nlog(n))
    回想求LIS的动态规划过程 dp[i]=max(dp[j]); (i>j&&h[j]<h[i])
    利用树状数组的性质: dp[i]=query(a[i]);
    但这道题上还有很多问题,比如负数的存在,应此需要离散化;
    应注意离散化后再去标记最大值,WA了好久好久..     
 #include <cstdio>
#include <cstring>
using namespace std;
int c[],n,t,len,a;
int find(int l,int r,int num){
while(l<=r){ int mid=(l+r)>>; if(c[mid]<=num) l=mid+; else r=mid-; }
return l;
}
int main(){
scanf("%d",&t);
for(int k=;k<=t;k++){
printf("Case #%d:\n",k);
scanf("%d",&n);
len=; memset(c,,sizeof(c));
for(int i=;i<=n;i++){
scanf("%d",&a);
if(i==){ c[len]=a-i; continue; }
int pos=find(,len,a-i);
c[pos]=a-i;
if(len<pos) len=pos;
} printf("%d\n",n-len);
} return ;
}
 #include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 1000000+5
int c[N],a[N],b[N],n,t,nmax;
void modify(int x,int num){while(x<=nmax)c[x]=max(c[x],num),x+=x&-x;}
int query(int x){int s=;while(x>)s=max(c[x],s),x-=x&-x;return s;}
int main(){
scanf("%d",&t);
for(int k=;k<=t;k++){
printf("Case #%d:\n",k);
scanf("%d",&n);
memset(c,,sizeof(c)); nmax=;
for(int i=;i<n;i++){
scanf("%d",&a[i]);
a[i]-=i; b[i]=a[i];
}
sort(b,b+n);
int size=unique(b,b+n)-b;//离散化
for(int i=;i<n;i++){
a[i]=lower_bound(b,b+size,a[i])-b+;
nmax=max(a[i],nmax);//离散化以后再去标记最大值
}
for(int i=;i<n;i++)modify(a[i],query(a[i])+);//前缀最大值+1
printf("%d\n",n-query(nmax));
} return ;
}

HDU 5256 - 序列变换 ,树状数组+离散化 ,二分法的更多相关文章

  1. HDU 4325 Flowers(树状数组+离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...

  2. HDU 6348 序列计数 (树状数组 + DP)

    序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  3. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  4. POJ 2299 【树状数组 离散化】

    题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...

  5. hdu4605 树状数组+离散化+dfs

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. Apple Tree POJ - 3321 dfs序列构造树状数组(好题)

    There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...

  7. HDU 3333 | Codeforces 703D 树状数组、离散化

    HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...

  8. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  9. HDU 4325 Flowers 树状数组+离散化

    Flowers Problem Description As is known to all, the blooming time and duration varies between differ ...

随机推荐

  1. 数据库监控[Z]

    --查看表锁 select * from sys.v_$sqlarea where disk_reads>100    --监控事例的等待 select event,sum(decode(wai ...

  2. 线程间通信的三种方式(NSThread,GCD,NSOperation)

    一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDel ...

  3. (转)C#创建datatable

    Asp.net DataTable添加列和行的方法 方法一: DataTable tblDatas = new DataTable("Datas"); DataColumn dc ...

  4. Java IO 和 NIO

    昨天面试问到了有关Java NIO的问题,没有答上来.于是,在网上看到了一篇很有用的系列文章讲Java IO的,浅显易懂.后面的备注里有该系列文章的链接.内容不算很长,需要两个小时肯定看完了,将该系列 ...

  5. inflate, findViewById与setContentView的区别与联系

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...

  6. Chapter 02:复合 VS 继承

    复合优先于继承,继承是实现代码重用的有力手段,并不是所有情况都适用,使用不当会导致软件变得很脆弱.与方法调用不同的是,继承打破了封装性. 总而言之,组合和继承,都能实现对类的扩展.但是要分具体情况用哪 ...

  7. openstack安装记录(一)环境准备

    参考文献: 官方文档 http://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/index.html 最小实例: 控制节点: 1 处理器, 4 ...

  8. 求绝对值,hdu-2003

    求绝对值 Problem Description 求实数的绝对值.   Input 输入数据有多组,每组占一行,每行包含一个实数.   Output 对于每组输入数据,输出它的绝对值,要求每组数据输出 ...

  9. StringBuilder[] 作为数组如何使用

    在工作中突然要用到这个就记录下来. 不知为何我这里的StringBuilder[] 数组必须要指明几个(les)才给用,否则就会报错. int les = 5; StringBuilder[] sb_ ...

  10. Oracle EBS-SQL (QA-1):检查超出检验周期的检验数据.sql

    select msi.segment1                                    物料编码,          msi.DESCRIPTION                ...