[BZOJbegin][NOIP十连测第九场]小P的单调数列(数学相关+dp+bit)
来源:互联网 发布:用友软件版本介绍 编辑:程序博客网 时间:2024/05/22 01:32
题目描述
题解
一个非常有用的性质是这个数列只可能是一个单增的数列或者是一个单增的数列接上一个单减的数列。
怎么证明呢?其实很简单。假设三个增减增的数列和分别为abc,那么它最终的和为(a+b+c)/3。可如果我们只选择较大的两个ab的话,答案为(a+b)/2。显然是比上一个小的。
f(i)表示以i为结尾最大单增子序列和,g(i)表示以i为开头最大单减子序列和。那么ans=max{f(i),(f(i)+g(i)-a(i))/2},1<=i<=n.
f(i)和g(i)都可以dp出来。最裸的dp是
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 100005int n,cnt;int a[N],p[N],val[N];double f[N],g[N];double C[N],ans;int cmp(int x,int y){ return a[x]<a[y];}void add(int loc,double val){ for (int i=loc;i<=n;i+=i&(-i)) C[i]=max(C[i],val);}double query(int loc){ double ans=0; for (int i=loc;i>=1;i-=i&(-i)) ans=max(ans,C[i]); return ans;}int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&a[i]),p[i]=i; sort(p+1,p+n+1,cmp); for (int i=1;i<=n;++i) if (a[p[i]]==a[p[i-1]]) val[p[i]]=cnt; else val[p[i]]=++cnt; f[1]=a[1];add(val[1],a[1]); for (int i=1;i<=n;++i) { double Max=query(val[i]-1); f[i]=Max+a[i]; add(val[i],f[i]); } memset(C,0,sizeof(C)); f[n]=a[n];add(val[n],a[n]); for (int i=n-1;i>=1;--i) { double Max=query(val[i]-1); g[i]=Max+a[i]; add(val[i],g[i]); } for (int i=1;i<=n;++i) { ans=max(ans,f[i]); ans=max(ans,(f[i]+g[i]-a[i])/2.0); } printf("%0.3lf\n",ans);}
总结
①平均数的话取两个最大的一定是最优的,因为不会有拉低平均数的东西存在。
0 0
- [BZOJbegin][NOIP十连测第九场]小P的单调数列(数学相关+dp+bit)
- [BZOJbegin][noip2016十连测第九场]小P的单调区间(dp+bit)
- [BZOJbegin][noip2016十连测第八场]神炎皇(数学相关:gcd)
- test 9 小p的单调数列 (dp+数学证明)
- [BZOJbegin][noip2016十连测第八场]降雷皇(dp+线段树)
- [BZOJbegin][noip2016十连测第八场]幻魔皇(dp)
- [BZOJbegin][NOIP十连测热身赛b]escape(二分+bfs)
- NOIP 2017 小凯的疑惑 (数学)
- NOIP模拟:最佳序列(单调队列DP)
- [BZOJ3142][Hnoi2013]数列(数学相关)
- [BZOJ3437]小P的牧场(斜率优化dp)
- bzoj 3437: 小P的牧场(斜率优化DP)
- bzoj 3437: 小P的牧场(斜率DP)
- NKOJ 3768 数列操作(单调队列/栈+DP)
- NKOJ 3775 数列操作(单调队列+DP)
- 递推(DP) noip 模拟 不等数列
- 【DP】 BZOJ 3437: 小P的牧场
- NOIP模拟dp专题 Question 单调栈
- #早安,努力#11.17
- [DP Hash] 51Nod 1055 最长等差数列
- Linux:编辑命令sed
- [组合数] 51Nod 1161 Partial Sums & Codeforces 223C #138 (Div. 1) Partial Sums
- linux(CentOs6.5)环境变量
- [BZOJbegin][NOIP十连测第九场]小P的单调数列(数学相关+dp+bit)
- [REVIEW] 高精度模板
- 用FOR循环和WHILE循环实现跳动的心
- 【Netty in Action学习笔记】Netty核心组件概念
- mysql服务的注册,启动、停止、注销。 [delphi代码实现]
- 欧拉函数的计算
- 个人阶段总结
- JIH的玩偶
- 第十二周oj项目A运用递归倒序输出数字