NOIP模拟 最佳序列【二分答案+线段树(单调队列)】
来源:互联网 发布:linux显示文本名 编辑:程序博客网 时间:2024/06/05 07:35
题目大意:
给出一个长度为n的序列,求所有长度在[L,R]中的子段的平均值的最大值。(1<=n<=100000)。
解题思路:
考试时发现平均值根本没有规律可言,所以想到了二分答案,就变为了判定性问题。
设二分答案为x,然后将所有数减去x,那如果有一个合法区间和大等于0,则说明该平均值较小,反之则较大。
那如何判定呢?对于一个左端点i,则合法区间右端点j在[i+L-1,i+R-1]之间,该区间和为sum[j]-sum[i-1](前缀和),而sum[i]已决定,我们只要找到sum[j]的最大值,看sum[j]-sum[i-1]是否大等于0,所以可以用线段树或单调队列维护所有前缀和即可。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<vector>#include<queue>#define ll long longusing namespace std;int getint(){ int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f;}const int N=20005;const double eps=1e-7,INF=1e18;int n,L,R,a[N];double sum[N],tr[N<<2];void build(int k,int l,int r){ if(l==r) { tr[k]=sum[l]; return; } int mid=l+r>>1; build(k<<1,l,mid),build(k<<1|1,mid+1,r); tr[k]=max(tr[k<<1],tr[k<<1|1]);}double query(int k,int l,int r,int x,int y){ if(l>r||x>y)return -INF; if(x<=l&&r<=y)return tr[k]; int mid=l+r>>1; if(y<=mid)return query(k<<1,l,mid,x,y); else if(x>mid)return query(k<<1|1,mid+1,r,x,y); else return max(query(k<<1,l,mid,x,mid),query(k<<1|1,mid+1,r,mid+1,y));}bool check(double num){ for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i]-num; build(1,1,n); for(int i=1;i<=n;i++) { double tmp=query(1,1,n,i+L-1,min(n,i+R-1)); if(tmp-sum[i-1]>=0)return true; } return false;}int main(){ //freopen("seq.in","r",stdin); //freopen("seq.out","w",stdout); n=getint(),L=getint(),R=getint(); double l=INF,r=0,ans; for(int i=1;i<=n;i++) { a[i]=getint(); l=min(l,(double)a[i]); r=max(r,(double)a[i]); } while(abs(r-l)>eps) { double mid=(l+r)*1.0/2; if(check(mid))ans=mid,l=mid; else r=mid; } printf("%0.4lf",ans); return 0;}
阅读全文
0 0
- NOIP模拟 最佳序列【二分答案+线段树(单调队列)】
- NOIP模拟:最佳序列(单调队列DP)
- NOIP模拟赛 军训(二分答案+单调队列优化DP)
- 10.11 NOIP模拟赛 DP + 线段树 + DP + 单调队列
- SPOJ1748 - SEQPAR2 二分答案 DP优化 单调队列+线段树
- noip模拟赛财富(单调队列)
- 最佳序列 二分答案
- NOIP模拟题 2016.11.9 [动态规划] [数论] [二分答案] [启发式合并] [线段树] [树链剖分]
- NOIP模拟(11.02)T2 最佳序列
- NOIP模拟(20171102)T2 最佳序列
- NOIP模拟 序列操作【线段树】
- bzoj 2096: [Poi2010]Pilots (二分答案+单调队列)
- 【NOIP 模拟题】[T2] 王者荣耀(二分答案+dp)
- NKOJ 2650 (SDOI 2011) 消防(树的直径+DP+单调队列/二分答案)
- [NOIP 模拟]穿越七色虹 二分答案
- 【NOIp模拟】【二分答案】电缆老板
- 【noip模拟题】[dp][二分][树链剖分][hdu5029][线段树]
- BZOJ 1012[jsoi2008] 最大数maxnumber 线段树(或者是单调队列+二分)
- ios自带排序 :sortedArrayUsingComparator
- 在Intellij Idea中怎么引入c标签
- [bzoj3626][LNOI2014]LCA 树链剖分
- ns2仿真学习(二)-tcp拥塞窗口的跟踪
- 接口限流算法总结
- NOIP模拟 最佳序列【二分答案+线段树(单调队列)】
- PID算法Demo
- openGL之glsl入门2--helloworld
- Spring整合ehcache
- nodeJS入门教程
- 学习阿里巴巴开发手册-12
- 2013NOIP普级组第一题--计数问题(参考洛谷题解)
- Hdu--Rescue之bfs加优先队列
- 【实战】从网络地址上下载图片