考虑暴力dp。

设\(dp_i\)表示前\(i\)个积木,保留积木\(i\)的最大答案。

那么有

\(dp_i=max(dp_j)+1(i>j,a_i>a_j,a_i-a_j\le i-j)\)

对\(j\)的限制条件里前2条显然,后一条是因为要使积木\(i\)和\(j\)之间有足够的积木使它们的相对位置正确。

由第三条可得\(i-a_i\ge j-a_j\)

那么就是一个三维偏序?

其实不是。由\(a_i>a_j,i-a_i\ge j-a_j\)可得\(i>j\)。

所以其实是一个二维偏序。

我们一开始记录\(v_i=i-a_i\),然后按\(a_i\)排序每次在线段树上查找\(v\)比\(v_i\)小的,\(dp\)的最大值用来更新答案,将\(dp_i\)加入线段树即可。

当然用树状数组也可以做。

code:

#include<bits/stdc++.h>
#define ci const int&
#define Upd(x) (t[x].mx=max(t[x<<1].mx,t[x<<1|1].mx))
using namespace std;
const int lim=1e6;
struct node{int l,r,mx;
}t[4000010];
struct CMP{int v1,v2;
}c[100010];
int n,h,sz,dp,ans;
bool cmp(CMP x,CMP y){return x.v1==y.v1?x.v2>y.v2:x.v1<y.v1;
}
void Build(ci x,ci l,ci r){t[x].l=l,t[x].r=r;if(l==r)return;int mid=l+r>>1;Build(x<<1,l,mid),Build(x<<1|1,mid+1,r);
}
void Change(ci x,ci d,ci v){if(t[x].l==t[x].r)return(void)(t[x].mx=max(t[x].mx,v));int mid=t[x].l+t[x].r>>1;d<=mid?Change(x<<1,d,v):Change(x<<1|1,d,v),Upd(x);
}
int Query(int x,int l,int r){if(t[x].l==l&&t[x].r==r)return t[x].mx;int mid=t[x].l+t[x].r>>1;return r<=mid?Query(x<<1,l,r):(l>mid?Query(x<<1|1,l,r):max(Query(x<<1,l,mid),Query(x<<1|1,mid+1,r)));
}
int main(){scanf("%d",&n);Build(1,0,lim);for(int i=1;i<=n;++i)scanf("%d",&h),i>=h?c[++sz]=(CMP){h,i-h},0:0;sort(c+1,c+sz+1,cmp);for(int i=1;i<=sz;++i)dp=Query(1,0,c[i].v2)+1,ans=max(ans,dp),Change(1,c[i].v2,dp);printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/xryjr233/p/BZOJ1109.html

[2019.3.17]BZOJ1109 [POI2007]堆积木Klo相关推荐

  1. BZOJ1109: [POI2007]堆积木Klo

    一开始状态就定的不一样-一直想着优化转移然后越走越远.. %%%Seter 我们令f[i]表示第i个积木的积木回到自己的位置,前i个积木最多有多少个归位 枚举前一个归位的积木,可以得到 f[i]=f[ ...

  2. bzoj 1109: [POI2007]堆积木Klo(二维偏序)

    1109: [POI2007]堆积木Klo Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1139  Solved: 423 [Submit][St ...

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

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

  4. BZOJ 1109: [POI2007]堆积木Klo 神分析, LIS, BIT, 二分

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

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

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

  6. [POI2007]堆积木Klo

    题解: dp定义方程的时候 好像也不能都用前一个来递推..这样就不能优化了 这题看了题解才想出来... 还是很简单的啊.... 我们定义f[i]表示前i个最大收益 那么j要能从i转移就得满足a[i]- ...

  7. CVPR 2019 | 百度17篇论文入选,AI巨头都在关注什么?(附论文下载)

    授权自AI科技大本营(ID:rgznai100) 本文共6400字,建议阅读10+分钟. 本文整理了百度入选CVPR的17篇论文的内容及应用场景. 计算机视觉和模式识别大会CVPR 2019即将于6月 ...

  8. 堆积木(基本数据结构-ArrayList数组的使用)

    蒜头君有 n 块积木,编号分别为 1 到 n.一开始,蒜头把第 i 块积木放在位置 i.蒜头君进行 m次操作,每次操作,蒜头把位置 b 上的积木整体移动到位置 a 上面. 比如 1 位置的积木是 1, ...

  9. echarts树点击label事件_ECharts 堆积木(砖块)游戏

    最近突发奇想,用 3D 的堆叠柱图,做了一个搭积木的小游戏. 主要思路 用一个几乎透明的 series-bar3D 铺满整个 grid3D,作为操作区,监听鼠标点击事件.完成堆积木的操作: 用多层数据 ...

最新文章

  1. [Objective-c 基础 - 2.1] 封装
  2. Product Long text - children usage
  3. wireshark使用教程 linux,Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕...
  4. oracle的in集合,oracle中in与not in集合中有空值问题
  5. php怎么创建对象变量,php实现变量动态创建类的对象用法
  6. 指针 | golang之指针的学习
  7. 【java】窗口中监听器的应用
  8. pdf转word好用的软件
  9. Typora 如何自动生成标题序号
  10. 如今引流横行的时代,你还缺乏流量吗?
  11. PHP字符串变量的长度限制问题
  12. 继承CAcUiStringEdit,改变编辑框的字体颜色,以及背景的颜色
  13. 工信部规范云服务市场经营行为 概念股望爆发
  14. 抖音电脑版怎么自动播放视频?
  15. VOD (Video On Demand),视频点播技术
  16. NRZ 对比 PAM4 调制技术
  17. 魔兽转移账号的服务器,《魔兽世界》那些区能进行免费角色转移服务 安苏、死亡之翼服务器免费角色转移服务现已开放...
  18. 假如生活欺骗了你-普希金
  19. asp.net 全局sql注入处理 sql关键字过滤 global过滤sql
  20. c语言中什么叫喂狗,STM32是怎么初始化看门狗和喂狗的

热门文章

  1. python实现自动拨号
  2. office2010下载大全
  3. console 篇 - console 中的 '$'
  4. L11.linux命令每日一练 -- 第二章 文件和目录操作命令 -- rename和basename命令
  5. H5手机搜索框的简单实现
  6. 【导航】自己的导航网站
  7. 习SQL语句之SQL语句大全
  8. 关于 基础连接已经关闭:接收时发生意外错误
  9. 生化危机8吸血鬼夫人暴君皮肤MOD
  10. Android手机屏幕坐标定义