博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[UVA 10534] Wavio Sequence
阅读量:6240 次
发布时间:2019-06-22

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

图片加载可能有点慢,请跳过题面先看题解,谢谢

1196604-20171014085431090-930894048.png
1196604-20171014085435527-1333594503.png

\(L[i]\)\(i\) 位置的最长上升子序列的长度

\(R[i]\)\(i\) 位置的最长下降子序列的长度
答案为:\(max(min(L[i],R[i])*2-1)\)
这里用到二分栈求 \(LIS\)

//made by Hero_of_Someone#include
#include
#include
#include
#define il inline#define RG registerusing namespace std;il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar(); if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int n,cnt,a[10010];int s[10010],L[10010],R[10010];il void init(){ for(int i=1;i<=n;i++) a[i]=gi();}il void work(){ memset(s,0,sizeof(s)); cnt=0; for(RG int i=1;i<=n;i++){ RG int x=a[i]; RG int l=1,r=cnt,k=0; while(l<=r){ RG int mid=(l+r)>>1; if(s[mid]>=x) r=mid-1; else l=mid+1,k=mid; } if(k==cnt) s[++cnt]=x,L[i]=cnt; else s[k]=min(s[++k],x),L[i]=L[i-1]; } memset(s,0,sizeof(s)); cnt=0; for(RG int i=n;i;i--){ RG int x=a[i]; RG int l=1,r=cnt,k=0; while(l<=r){ RG int mid=(l+r)>>1; if(s[mid]>=x) r=mid-1; else l=mid+1,k=mid; } if(k==cnt) s[++cnt]=x,R[i]=cnt; else s[k]=min(s[++k],x),R[i]=R[i+1]; } int ans=0; for(int i=1;i<=n;i++) ans=max(ans,min(L[i],R[i])*2-1); printf("%d\n",ans);}int main(){ while(scanf("%d",&n)!=EOF){ init(); work(); } return 0; }

转载于:https://www.cnblogs.com/Hero-of-someone/p/7665655.html

你可能感兴趣的文章
OSChina 周日乱弹 ——会爬墙的不仅仅是壁虎还有班主任
查看>>
OSChina 周日乱弹 —— 小云云生日快乐
查看>>
负载均衡原理与实践详解 第一篇
查看>>
前端那些事之框架封装基础篇
查看>>
mysqld服务器cpu/iowait瞬间出现峰值的问题
查看>>
tornado的CURD操作
查看>>
Lambda对方法和构造器的引用
查看>>
ABBYY FineReader 12PDF选项卡之保存模式
查看>>
Python如何自定义模块?Python基础教程,第十讲,自定义模块
查看>>
monkeysocks开发日志--TCP协议分析及架构规划
查看>>
svn备份、转移、安装到新服务器
查看>>
初识systemd-使用篇
查看>>
全球BGP路由表浏览
查看>>
Hibernate持久化技术实例讲解
查看>>
推荐一款轻量级的linux系统和网络监控工具
查看>>
YUM的使用方法
查看>>
C++:duplicate symbol
查看>>
C#基础(Day05)
查看>>
正则表达式
查看>>
robocode 机器人编码
查看>>