博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj5427】最长上升子序列(贪心+LIS)
阅读量:7305 次
发布时间:2019-06-30

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

  题目传送门:

  因为noip,博客咕了好久,这几天集中填一下坑。

  这题我们可以假设往不确定的空位里填数,然后考虑一下如何尽可能让空位多被选上。我们发现,如果有一个空位没在最后的最长上升子序列里,那么可以贪心地去掉一个被选上的数再加上去。

  那么我们假定所有的空位都被选上。这样原序列就被划分成了许多段,而每一段内的在最长上升子序列里的数都必须与两边相差至少2(留一个数给空位)。那么我们可以把每一段数整体减去前面空位的数量(即每个数的数值减去前面没被确定的数的个数),然后直接跑一遍最长上升子序列,加上空位数量就行了。

  代码:

#include
#include
using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline int read(){
int tmp=0; char c=nc(),f=1; for(;c<'0'||'9'
st;int n,k,delta=0;int main(){ n=read(); for(int i=1;i<=n;i++){ char ch=nc(); while(ch<'A'||'Z'
::iterator iter=st.lower_bound(k-delta); if(iter==st.end())st.insert(k-delta); else if(*iter+delta>k)st.erase(iter),st.insert(k-delta); } else{ ++delta; st.insert(-1000000000-delta); } } printf("%d\n",st.size());}
bzoj5427

 

转载于:https://www.cnblogs.com/quzhizhou/p/10070606.html

你可能感兴趣的文章
从hadoop 要删除字符串匹配指定的任务
查看>>
html name id, 与服务器交互必须有name
查看>>
启用多处理器编译--加快VS2013编译
查看>>
CodeForces Round#229 DIV2 C 递归DP
查看>>
zebra/quagga
查看>>
E. Mike and Foam(容斥原理)
查看>>
[每日电路图] 3、无线充电原理解析及经典设计方案集锦【转+解读】
查看>>
【filezilla】 ubuntu下安装filezilla
查看>>
HDU 4839 The Game of Coins _(:зゝ∠)_
查看>>
反射机制、依赖注入、控制反转
查看>>
《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用
查看>>
PHP在Windows下安装配置第一步
查看>>
SlipButton——滑动开关
查看>>
用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库
查看>>
17 个 tar 命令实用示例【转】
查看>>
第八十二节,CSS3过渡效果
查看>>
Linux查看系统开机时间
查看>>
header元素
查看>>
QT 网络编程一
查看>>
Eclipse插件Target Management (RSE)
查看>>