Description

  Mary在她的生日礼物中有一些积木。那些积木都是相同大小的立方体。每个积木上面都有一个数。Mary用他的
所有积木垒了一个高塔。妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置。一个上面写有数i
的积木的正确位置是这个塔从下往上数第i个位置。Mary决定从现有的高塔中移走一些,使得有最多的积木在正确
的位置。请你告诉Mary她应该移走哪些积木。
Input

  第一行为一个数n,表示高塔的初始高度。第二行包含n个数a1,a2,…,an,表示从下到上每个积木上面的数。
(1<=n<=100000,1<=ai<=1000000)。
Output

  注意:请输出最多有多少点可以处在正确位置
Sample Input
5

1 1 2 5 4
Sample Output
3

解题方法: 我们先列一下普通的DP方程,

dp[i]=max(dp[j]+1)(j<i,a[j]<a[i],a[i]−a[j]<=i−j)

dp[i] = max(dp[j] + 1) (j

然后这里就是3个限制条件了?CDQ三维偏序?翻了翻题解,发现神思路的题目。观察三个限定条件。

1,j<i

1, j

2,a[j]<a[i]

2,a[j]

3,a[i]−a[j]<=i−j

3,a[i] - a[j]

容易发现已知2,3可以推出1。
而1代表的是这n个数的排列顺序。
而2的条件即为最长上升子序列。
所以我们不妨把3看做这n个数的重新排列法则,之后满足2的条件即可。
所以我们只需要按照j−a[j]<=i−a[i]把n个数重新排列,接着求一个最长上升子序列长度即可。
需要注意的是,如果i−a[i]<0的话,那么显然这个数不可能与C序列中的某个数对应上,直接跳过即可。

LIS可以二分也可以用树状数组的方法,PO爷用的树状数组的方法,可以看PO爷博客,蒟蒻写了一个代码和博主几乎一样的二分版本的代码。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int maxm = 1000010;
struct node{int x, y;node(){}node(int x, int y) : x(x), y(y) {}bool operator < (const node &rhs) const{if(x == rhs.x) return y < rhs.y;return x < rhs.x;}
}b[maxn];
int n, cnt, ans, d[maxm], a[maxn];int main(){scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &a[i]);if(i - a[i] < 0) continue;b[++cnt].x = i - a[i], b[cnt].y = a[i];}sort(b + 1, b + cnt + 1);memset(d, 0x3f, sizeof(d));for(int i = 1; i <= cnt; i++){int l = 1, r = ans, len = 0;while(l <= r){int mid = (l + r) / 2;if(b[i].y > d[mid]){len = mid, l = mid + 1;}else{r = mid - 1;}}ans = max(ans, len + 1);d[len + 1] = min(d[len + 1], b[i].y);}cout << ans << endl;return 0;
}

BZOJ 1109: [POI2007]堆积木Klo 神分析, LIS, BIT, 二分相关推荐

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

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

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

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

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

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

  4. [2019.3.17]BZOJ1109 [POI2007]堆积木Klo

    考虑暴力dp. 设\(dp_i\)表示前\(i\)个积木,保留积木\(i\)的最大答案. 那么有 \(dp_i=max(dp_j)+1(i>j,a_i>a_j,a_i-a_j\le i-j ...

  5. BZOJ1109: [POI2007]堆积木Klo

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

  6. [POI2007]堆积木Klo

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

  7. 给初学编程的业余爱好者——会堆积木就会编程

    首先说明的是,这不是教材,只是看着一些拜师啊跪求啊等词眼不爽而堆的字,版权神马滴没有,能拿去骂人更好. 在计算机技术高度普及的21世纪,编程不再是像20世纪五六十年代那样只是身在高高神坛的家伙骗吃骗喝 ...

  8. ps随机排列_漂亮!自然材料:人工可控微米级胶体粒子“堆积木”——粒子随心所欲的组装排列!...

    堆积木俨然已经成为了幼儿教育必备课程,通过堆积木可促进幼儿大脑发育.利用形状相同的基元可组装出各种不同结构,同时也可以通过不同基元之间的匹配组装更加新颖的结构.由于堆积木的组装灵活性,这一概念也被科研 ...

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

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

最新文章

  1. [原创]关于javax.servlet.ServletException: File [/loginController/getVerifCode.jsp] not found异常 解决方案
  2. ListDefinition Tips
  3. 2015.12.11-2015.12.13 金华旅程的学习计划
  4. tcga数据下载_好东西丨零基础入门TCGA
  5. 使用 Boost.MPI 的 gather() 的示例
  6. 【06】sass编译工具(弃)
  7. MySQL单列索引与复合索引选择
  8. ELK安装配置及nginx日志分析
  9. 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
  10. 关于selenium关闭chrome密码登录时弹出的密码提示框
  11. 清除Conficker蠕虫病毒详细步骤
  12. 学生考勤报表管理小程序
  13. 仿支付宝支付密码输入框功能
  14. 微软发布Windows 10:连Windows 7都能免费升级了
  15. 雨点效果——HTML5之特效
  16. DDD之一年级小学生作业辅导
  17. 那些年踩过的坑-之《Android Q-高通平台UAC(USB Audio Class)调试记录》
  18. html表单验证邮箱表达式,Javascript正则表达式实现表单验证
  19. 阿里云服务器白嫖和购买教程——学生向
  20. python导入自定义模块报attributeerror_Python脚本报错AttributeError: ‘module’ src has no attribute’xxx’解决方法...

热门文章

  1. 【2022牛客多校第六场 Z题 Game on grid】dp
  2. 【技巧】如何全文搜索oracle官方文档
  3. 史上最牛C语言控制台游戏!C语言控制台音游——Rhythm Slasher! 附上源代码供交流学习
  4. 分布式系统里session同步
  5. 芯片自动焊接机器人机械系统的设计
  6. JAVA获取系统配置信息
  7. Python 基础之字符串操作,函数及格式化format
  8. 盘点几大沙雕又有趣的 GitHub 程序,你看过了吗?
  9. 东南任务汇-创业者需要具备这十项能力
  10. OTA系列小问答:为什么汽车OTA会比IT OTA发展要晚呢?汽车OTA与传统OTA有什么区别?FOTA与OTA区别在哪?