BZOJ 1109: [POI2007]堆积木Klo 神分析, LIS, BIT, 二分
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
然后这里就是3个限制条件了?CDQ三维偏序?翻了翻题解,发现神思路的题目。观察三个限定条件。
1, j
2,a[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, 二分相关推荐
- bzoj 1109: [POI2007]堆积木Klo(二维偏序)
1109: [POI2007]堆积木Klo Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1139 Solved: 423 [Submit][St ...
- BZOJ 1109 [POI2007]堆积木Klo(树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1109 [题目大意] Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体. ...
- BZOJ.1109.[POI2007]堆积木Klo(DP LIS)
BZOJ 二维\(DP\)显然.尝试换成一维,令\(f[i]\)表示,强制把\(i\)放到\(a_i\)位置去,现在能匹配的最多数目. 那么\(f[i]=\max\{f[j]\}+1\),其中\(j& ...
- [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 ...
- BZOJ1109: [POI2007]堆积木Klo
一开始状态就定的不一样-一直想着优化转移然后越走越远.. %%%Seter 我们令f[i]表示第i个积木的积木回到自己的位置,前i个积木最多有多少个归位 枚举前一个归位的积木,可以得到 f[i]=f[ ...
- [POI2007]堆积木Klo
题解: dp定义方程的时候 好像也不能都用前一个来递推..这样就不能优化了 这题看了题解才想出来... 还是很简单的啊.... 我们定义f[i]表示前i个最大收益 那么j要能从i转移就得满足a[i]- ...
- 给初学编程的业余爱好者——会堆积木就会编程
首先说明的是,这不是教材,只是看着一些拜师啊跪求啊等词眼不爽而堆的字,版权神马滴没有,能拿去骂人更好. 在计算机技术高度普及的21世纪,编程不再是像20世纪五六十年代那样只是身在高高神坛的家伙骗吃骗喝 ...
- ps随机排列_漂亮!自然材料:人工可控微米级胶体粒子“堆积木”——粒子随心所欲的组装排列!...
堆积木俨然已经成为了幼儿教育必备课程,通过堆积木可促进幼儿大脑发育.利用形状相同的基元可组装出各种不同结构,同时也可以通过不同基元之间的匹配组装更加新颖的结构.由于堆积木的组装灵活性,这一概念也被科研 ...
- 堆积木(基本数据结构-ArrayList数组的使用)
蒜头君有 n 块积木,编号分别为 1 到 n.一开始,蒜头把第 i 块积木放在位置 i.蒜头君进行 m次操作,每次操作,蒜头把位置 b 上的积木整体移动到位置 a 上面. 比如 1 位置的积木是 1, ...
最新文章
- [原创]关于javax.servlet.ServletException: File [/loginController/getVerifCode.jsp] not found异常 解决方案
- ListDefinition Tips
- 2015.12.11-2015.12.13 金华旅程的学习计划
- tcga数据下载_好东西丨零基础入门TCGA
- 使用 Boost.MPI 的 gather() 的示例
- 【06】sass编译工具(弃)
- MySQL单列索引与复合索引选择
- ELK安装配置及nginx日志分析
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 关于selenium关闭chrome密码登录时弹出的密码提示框
- 清除Conficker蠕虫病毒详细步骤
- 学生考勤报表管理小程序
- 仿支付宝支付密码输入框功能
- 微软发布Windows 10:连Windows 7都能免费升级了
- 雨点效果——HTML5之特效
- DDD之一年级小学生作业辅导
- 那些年踩过的坑-之《Android Q-高通平台UAC(USB Audio Class)调试记录》
- html表单验证邮箱表达式,Javascript正则表达式实现表单验证
- 阿里云服务器白嫖和购买教程——学生向
- python导入自定义模块报attributeerror_Python脚本报错AttributeError: ‘module’ src has no attribute’xxx’解决方法...