博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj5442: [Ceoi2018]Global warming
阅读量:5234 次
发布时间:2019-06-14

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

这题考转换问题啊

假如区间[l,r]+1,不如[l,n]+1

假如区间[l,r]-1,不如[1,r]-1,就变成(r,n]+1

问题就转化成了求LIS,其中x~n一段可以加m

正着跑维护1~x-1的最长上升,且x必选并+m的最大值

反着跑维护x~n的最长上升,两个合并一下

#include
#include
#include
#include
#include
#include
using namespace std;int a[210000],f[210000],h[210000];int tp,g[210000];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); tp=1; memset(g,63,sizeof(g)); f[1]=1,g[1]=a[1]; for(int i=2;i<=n;i++) { if(a[i]>g[tp]) { tp++; f[i]=tp; g[tp]=a[i]; } else if(a[i]+m>g[tp]) { f[i]=tp+1; int id=lower_bound(g+1,g+tp+1,a[i])-g; g[id]=a[i]; } else { int id=lower_bound(g+1,g+tp+1,a[i])-g; f[i]=lower_bound(g+1,g+tp+1,a[i]+m)-g; g[id]=a[i]; } } int ans=tp;tp=1; memset(g,63,sizeof(g)); h[n]=1,g[1]=-a[n]; ans=max(ans,f[n]+h[n]-1); for(int i=n-1;i>=1;i--) { if(-a[i]>g[tp]) { tp++; h[i]=tp; g[tp]=-a[i]; } else { int id=lower_bound(g+1,g+tp+1,-a[i])-g; h[i]=id; g[id]=-a[i]; } ans=max(ans,f[i]+h[i]-1); } printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/9667427.html

你可能感兴趣的文章
ubuntu 14.04 安装搜狗拼音输入法
查看>>
浅谈算法和数据结构: 一 栈和队列
查看>>
Java内部类详解
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
图论-次短路求法
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>
JSON跨域解决方案收集
查看>>
SSH框架整合总结
查看>>
图的深度优先遍历
查看>>
C# 之 提高WebService性能大数据量网络传输处理
查看>>
md5sum命令详解
查看>>
[bzoj1004] [HNOI2008] Cards
查看>>
应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用...
查看>>
原生HttpClient详细使用示例
查看>>
几道面试题
查看>>