【题意】

n个数的序列,删除一个数后序列左移,求最后满足i==a[i]的最大个数。

【思路】

设最终得到a[i]==i的序列为s,则s应满足:

i<j,a[i]<a[j],i-a[i]<=j-a[j]

  最后一项代表后边的移动距离不少于前边的。

因为i=i-a[i]+a[i]

所以只要满足i-a[i]单调不减,a[i]单调递增则i一定递增。

则问题转化为一个二维偏序问题,O(nlogn)求LIS。用个BIT即可。

【代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8. const int N = 2e5+;
  9.  
  10. struct Node {
  11. int a,b;
  12. bool operator <(const Node& rhs) const {
  13. if(a!=rhs.a) return a<rhs.a;
  14. else return b<rhs.b;
  15. }
  16. }ns[N];
  17.  
  18. int C[N],mx;
  19. void upd(int x,int v) {
  20. for(;x<=mx;x+=x&-x)
  21. C[x]=max(C[x],v);
  22. }
  23. int query(int x) {
  24. int res=;
  25. for(;x;x-=x&-x)
  26. res=max(res,C[x]);
  27. return res;
  28. }
  29.  
  30. ll read() {
  31. char c=getchar(); ll f=,x=;
  32. while(!isdigit(c)) {
  33. if(c=='-') f=-;
  34. c=getchar();
  35. }
  36. while(isdigit(c))
  37. x=x*+c-'',
  38. c=getchar();
  39. return x*f;
  40. }
  41.  
  42. int n,a[N];
  43.  
  44. int main()
  45. {
  46. //freopen("klo.in","r",stdin);
  47. //freopen("klo.out","w",stdout);
  48. n=read();
  49. int tot=;
  50. for(int i=;i<=n;i++) {
  51. a[i]=read();
  52. mx=max(mx,a[i]);
  53. if(i>=a[i])
  54. ns[++tot].a=i-a[i],ns[tot].b=a[i];
  55. }
  56. sort(ns+,ns+tot+);
  57. int ans=;
  58. for(int i=;i<=tot;i++) {
  59. int x=query(ns[i].b-)+;
  60. ans=max(ans,x);
  61. upd(ns[i].b,x);
  62. }
  63. printf("%d\n",ans);
  64. return ;
  65. }

P.S.感觉挺巧妙的 %%%

bzoj 1109 [POI2007]堆积木Klo(LIS)的更多相关文章

  1. BZOJ 1109 POI2007 堆积木Klo LIS

    题目大意:给定一个序列,能够多次将某个位置的数删掉并将后面全部数向左串一位,要求操作后a[i]=i的数最多 首先我们如果最后a[i]=i的数的序列为S 那么S满足随着i递增,a[i]递增(相对位置不变 ...

  2. BZOJ 1109: [POI2007]堆积木Klo

    1109: [POI2007]堆积木Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 948  Solved: 341[Submit][Statu ...

  3. BZOJ.1109.[POI2007]堆积木Klo(DP LIS)

    BZOJ 二维\(DP\)显然.尝试换成一维,令\(f[i]\)表示,强制把\(i\)放到\(a_i\)位置去,现在能匹配的最多数目. 那么\(f[i]=\max\{f[j]\}+1\),其中\(j& ...

  4. BZOJ 1109 [POI2007]堆积木Klo(树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1109 [题目大意] Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体. ...

  5. 1109: [POI2007]堆积木Klo

    1109: [POI2007]堆积木Klo https://lydsy.com/JudgeOnline/problem.php?id=1109 分析: 首先是dp,f[i]表示到第i个的最优值,f[i ...

  6. 【BZOJ】1109: [POI2007]堆积木Klo

    题意 \(n(1 \le n \le 100000)\)个数放在一排,可以一走一些数(后面的数向前移),要求最大化\(a_i=i\)的数目. 分析 分析容易得到一个dp方程. 题解 \(d(i)\)表 ...

  7. 【BZOJ1109】[POI2007]堆积木Klo 二维偏序

    [BZOJ1109][POI2007]堆积木Klo Description Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔 ...

  8. BZOJ1109 : [POI2007]堆积木Klo

    f[i]表示第i个在自己位置上的最大值 则f[i]=max(f[j])+1 其中 j<i a[j]<a[i] a[i]-a[j]<=i-j -> j-a[j]<=i-a[ ...

  9. 【bzoj1109】[POI2007]堆积木Klo 动态规划+树状数组

    题目描述 Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置 ...

随机推荐

  1. C内存分配函数

    C语言跟内存分配方式(1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量.(2) 在栈上创建.在执行函数时,函数内局部变量的 ...

  2. PCB板的价格是怎么算出来的?

    Part 1 :影响一块PCB板价格的各种因素 PCB的价格是很多采购者一直很困惑的事情,很多人在线下单时也会疑问这些价格是怎么算出来的,下面我们就一起谈论一下PCB价格的组成因素. 1.PCB所用材 ...

  3. Entity Freamwork 6连接PostgreSql数据库

    原文 Entity Freamwork 6连接PostgreSql数据库 开发环境 VS 2015  Update 1   Postgre Sql 9.4 使用过程 1.使用Nuget在项目中添加对E ...

  4. HDU5088——Revenge of Nim II(高斯消元&矩阵的秩)(BestCoder Round #16)

    Revenge of Nim II Problem DescriptionNim is a mathematical game of strategy in which two players tak ...

  5. EJB--事务管理 .

    在我们对事务的基本概念以及出现的问题和隔离级别有进一步的了解之后,接下来看看EJB是如何进行事务管理. 在EJB中有两种使用事务的方式.第一种方式通过容器管理的事务,叫CMT(Container-Ma ...

  6. ubuntu13.04下载android4.0.1源码过程

    最初我参考的是老罗的博客http://blog.csdn.net/luoshengyang/article/details/6559955 进行下载安装的,但弄着弄着就发现不太对劲了.这里记录下详细过 ...

  7. Android的NDK开发(4)————JNI数据结构之JNINativeMethod

    转至:http://blog.csdn.net/conowen/article/details/7524744 1.JNINativeMethod 结构体的官方定义 typedef struct { ...

  8. 面向对象设计Object Oriented Design

    http://www.codeproject.com/Articles/93369/How-I-explained-OOD-to-my-wife http://www.cnblogs.com/niyw ...

  9. 【C#学习笔记】读SQL Server2008

    using System; using System.Data.SqlClient; namespace ConsoleApplication { class Program { static voi ...

  10. 【Java】Java处理double相加的结果异常

    方式一(四舍五入):保留两位小数 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, ...