博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVALive 4976 Defense Lines
阅读量:5076 次
发布时间:2019-06-12

本文共 1132 字,大约阅读时间需要 3 分钟。

UVALive_4976

    这个题目可以先预处理出每个点向左走一共有多少个连续下降的元素,以及向右走一共有多少个连续上升的元素,处理出这两个东西后思路基本就有了。

    接下来用线段树也可以做,或者可以借鉴O(NlogN)求解最长上升子序列的方法的思想来做,但后者效率更高一些。

#include
#include
#include
#define MAXD 200010int N, a[MAXD], s[MAXD], R[MAXD], top;void init(){ int i; scanf("%d", &N); for(i = 1; i <= N; i ++) scanf("%d", &a[i]); for(R[N] = 1, i = N - 1; i >= 1; i --) R[i] = a[i] < a[i + 1] ? R[i + 1] + 1 : 1;}int BS(int h){ int mid, min = 0, max = top + 1; for(;;) { mid = min + max >> 1; if(mid == min) break; if(s[mid] < h) min = mid; else max = mid; } return mid;}void solve(){ int i, k, x = 1, ans = 1; top = 0, s[++ top] = a[1]; for(i = 2; i <= N; i ++) { ans = std::max(ans, BS(a[i]) + R[i]); a[i] > a[i - 1] ? ++ x : x = 1; if(x > top) s[++ top] = a[i]; else s[x] = std::min(s[x], a[i]); } printf("%d\n", ans);}int main(){ int t; scanf("%d", &t); while(t --) { init(); solve(); } return 0;}

转载于:https://www.cnblogs.com/staginner/archive/2012/08/24/2654783.html

你可能感兴趣的文章
Day 8 Linux之Day8
查看>>
Ext.Net学习笔记04:Ext.Net布局
查看>>
笔记——collections模块
查看>>
fckeditor 读数据库数据显示不正常(转)
查看>>
(动态规划)matrix -- hdu -- 5569
查看>>
河南省第六届ACM程序设计大赛
查看>>
屏蔽VA01的TA類型的銷售部門和銷售組
查看>>
linux rename命令批量修改文件名
查看>>
机器学习的MLE和MAP:最大似然估计和最大后验估计
查看>>
ldconfig , ldd 与 LD_LIBRARY_PATH 之间的关系
查看>>
如何给localStorage设置一个过期时间?
查看>>
获取页面和元素可视高度
查看>>
二叉树的三种遍历(非递归)
查看>>
akka之种子节点
查看>>
不知道做什么时
查看>>
matlab 给某一列乘上一个系数
查看>>
密码学笔记——培根密码
查看>>
Screening technology proved cost effective deal
查看>>
MAC 上升级python为最新版本
查看>>
创业老板不能犯的十种错误
查看>>