博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj 十连测】[noip2016十连测第九场]Problem B: 小P的单调区间(最长上升子序列+树状数组)...
阅读量:4495 次
发布时间:2019-06-08

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

【题解】【最长上升子序列+树状数组】

【通过分析题目可以得知,最优情况应该是一段子序列或两段子序列。这样一来就比较好做了。正着做一遍最长上升子序列,再倒着做一遍。枚举点,判断是一段优还是两段优。】

【由于朴素的最长上升子序列是O(n^2)的,会T,所以用树状数组加速成O(nlogn)】

#include
#include
#include
using namespace std;double tree[100010],f[100010],g[100010],ans;int a[100010],num[100010],n,m;inline int lowbit(int x){ return (x&(-x));}inline void add(int x,double val){ for(int i=x;i<=n;i+=lowbit(i)) if(tree[i]
0;i-=lowbit(i)) if(tree[i]>sum) sum=tree[i]; return sum;}int main(){ int i,j; scanf("%d",&n); for(i=1;i<=n;++i)scanf("%d",&a[i]),num[i]=a[i]; sort(num+1,num+n+1); m=unique(num+1,num+n+1)-num-1; for(i=1;i<=n;++i) { int x=lower_bound(num+1,num+m+1,a[i])-num; double tmp=ask(x); f[i]=tmp+a[i]; add(x+1,f[i]); } memset(tree,0,sizeof(tree)); for(i=n;i>0;--i) { int x=lower_bound(num+1,num+m+1,a[i])-num; double tmp=ask(x); g[i]=tmp+a[i]; add(x+1,g[i]); } for(i=1;i<=n;++i) { ans=max(ans,f[i]*1.0); ans=max(ans,(f[i]+g[i]-(double)a[i])/2.0); } printf("%.3lf\n",ans); return 0;}

转载于:https://www.cnblogs.com/lris-searching/p/9402901.html

你可能感兴趣的文章
【JZOJ4161】于神之怒 莫比乌斯反演
查看>>
实践作业4:Web测试实践(小组作业)每日任务记录2
查看>>
kubernetes 之一些报错
查看>>
PHP isset()、empty()、is_null()的使用区别详解
查看>>
软件产品案例分析(团队)
查看>>
eclipse中svn插件的安装
查看>>
北京赛区总结
查看>>
Mysql安装后的一些设置
查看>>
4、Qt Project之串口数据传输
查看>>
Python List reverse()方法
查看>>
Jmeter 正则提取器
查看>>
lua -- 生成协议
查看>>
HLP帮助文件源文件RTF文件的编写
查看>>
2.30模型字符串拷贝
查看>>
XPATH怎么获取TITLE中有中文的标签
查看>>
Tomcat中server.xml参数说明
查看>>
Wget下载终极用法和15个详细的例子
查看>>
JavaScript16进制颜色值和rgb的转换
查看>>
Laravel 输出Hellow World!
查看>>
【bzoj 十连测】[noip2016十连测第九场]Problem B: 小P的单调区间(最长上升子序列+树状数组)...
查看>>