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代码

附一张提交记录

最新文章

  1. 关于移动端meta设置
  2. Java绘图
  3. JSP标准标签库(JSTL)之核心标签(下)
  4. 三、saltstack证书管理
  5. QQ音乐项目(OC版) - 实现细节
  6. LR_问题_控制器不能使用定义的负载生成器
  7. 在工程中添加pch文件
  8. c++ ANSI、UNICODE、UTF8互转
  9. hdu 2197 本原串
  10. No1_5.字符串的基本操作_Java学习笔记
  11. js获得url内的参数
  12. 数据结构录 之 BST的高级应用。
  13. Ubuntu安装Nginx+PHP7.0.4+MySQL5.6
  14. Vue(小案例_vue+axios仿手机app)_公共组件(路由组件传参)
  15. 【GPU编解码】GPU硬解码---DXVA (转)
  16. wordpress学习(五)----插件
  17. POJ-3252 Avenger
  18. protected
  19. 【arc073D】Many Moves
  20. CentOS下Docker的安装及国内镜像配置

热门文章

  1. day 7-11 初识MySQL数据库及安装密码设置破解
  2. 金蝶CLOUD与EAS的区别
  3. django restframework PrimaryKeyRelatedField筛选的困惑
  4. 1.Java简介
  5. Javaweb小结之——JavaBean+持久层
  6. 表单中input name属性有无[]的区别
  7. Spring Boot 构建电商基础秒杀项目 (三) 通用的返回对象 &amp; 异常处理
  8. Codevs1541[USACO]围墙涂色
  9. poj-2752(拓展kmp)
  10. Linux命令归纳