洛谷P1020 导弹拦截
2024-10-15 03:05:33
n²谁都会打,不说了。
这里讨论一下nlogn算法(单调不减):
首先开始考虑单调性,我习惯性的以为是单调队列/栈优化的那个套路,想要找到一个跟下标有关的单调性却发现没有。
例如:我想过当下标增加时f[i]增加,后来发现了反例:1 3 4 2
事实上也没有别的想得到的了。
我跑去看题解,发现单调性是这个毒瘤:
当单调不减子序列长度增加时,每个长度对应的最小高度增加。
然后每次二分出一个长度,保证最小高度刚好不大于a[i]
然后用a[i]更新f[i]的最小高度...
然后就没啥难点了,A了。
#include <cstdio>
#include <algorithm>
#include <cstring> const int N = ; int a[N], f[N], p[N], top; inline int BS(int x) {
int l = , r = top, mid;
while(l < r) {
mid = (l + r + ) >> ;
if(p[mid] < x) {
r = mid - ;
}
else {
l = mid;
}
}
return r;
} inline int BS2(int x) {
int l = , r = top, mid;
while(l < r) {
mid = (l + r + ) >> ;
if(p[mid] >= x) {
r = mid - ;
}
else {
l = mid;
}
}
return r;
} int main() {
int n = , x;
while(scanf("%d", &x) != -) {
a[++n] = x;
}
for(int i = ; i <= n; i++) {
int t = BS(a[i]);
f[i] = t + ;
p[f[i]] = std::max(p[f[i]], a[i]);
top = std::max(top, f[i]);
}
printf("%d \n", top);
top = ;
memset(p, 0x7f, sizeof(p));
for(int i = ; i <= n; i++) {
int t = BS2(a[i]);
f[i] = t + ;
p[f[i]] = std::min(p[f[i]], a[i]);
top = std::max(top, f[i]);
}
printf("%d", top);
return ;
}
AC代码
附一张提交记录
最新文章
- 关于移动端meta设置
- Java绘图
- JSP标准标签库(JSTL)之核心标签(下)
- 三、saltstack证书管理
- QQ音乐项目(OC版) - 实现细节
- LR_问题_控制器不能使用定义的负载生成器
- 在工程中添加pch文件
- c++ ANSI、UNICODE、UTF8互转
- hdu 2197 本原串
- No1_5.字符串的基本操作_Java学习笔记
- js获得url内的参数
- 数据结构录 之 BST的高级应用。
- Ubuntu安装Nginx+PHP7.0.4+MySQL5.6
- Vue(小案例_vue+axios仿手机app)_公共组件(路由组件传参)
- 【GPU编解码】GPU硬解码---DXVA (转)
- wordpress学习(五)----插件
- POJ-3252 Avenger
- protected
- 【arc073D】Many Moves
- CentOS下Docker的安装及国内镜像配置
热门文章
- day 7-11 初识MySQL数据库及安装密码设置破解
- 金蝶CLOUD与EAS的区别
- django restframework PrimaryKeyRelatedField筛选的困惑
- 1.Java简介
- Javaweb小结之——JavaBean+持久层
- 表单中input name属性有无[]的区别
- Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 &; 异常处理
- Codevs1541[USACO]围墙涂色
- poj-2752(拓展kmp)
- Linux命令归纳