传送门

二分答案好题。

题意简述:要求支持动态在一个数列队尾加入一个新的数(保证数列单增),查询所有子数列的 最大值减平均值 的最大值。


然而网上一堆高人是用三分做的。

我们先考虑当前的答案有可能由什么构成。

  1. 加入最后一个数之前的最大值。
  2. 加入最后一个数之后,以最后一个数为最大值的值。

于是问题变成了去求min{(∑j=1iai)+ani+1}min\{\frac{(\sum_{j=1}^ia_i)+a_n}{i+1}\}min{i+1(∑j=1i​ai​)+an​​}

然后令bi=(∑j=1iai)+ani+1,ci=bi−bi−1b_i=\frac{(\sum_{j=1}^ia_i)+a_n}{i+1},c_i=b_i-b_{i-1}bi​=i+1(∑j=1i​ai​)+an​​,ci​=bi​−bi−1​,可以用作差法证明ccc数组单调,于是二分出ccc最接近0的项就行了。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=5e5+5;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
typedef long long ll;
ll sum[N],a[N];
int tot=0;
double Ans=0;
inline void modify(){
	int l=1,r=tot-1,ans=1;
	while(l<=r){
		int mid=l+r>>1;
		ll fi=a[tot]-a[mid]*mid+sum[mid-1];
		if(fi<=0)r=mid-1;
		else l=mid+1,ans=mid;
	}
	Ans=max(Ans,a[tot]-1.0*(sum[ans]+a[tot])/(ans+1));
}
int main(){
	freopen("lx.in","r",stdin);
	for(ri op,tt=read();tt;--tt){
		op=read();
		if(op==1){
			a[++tot]=read(),sum[tot]=a[tot]+sum[tot-1];
			modify();
		}
		else printf("%.10lf\n",Ans);
	}
	return 0;
}

最新文章

  1. Web安全相关(一):跨站脚本攻击(XSS)
  2. Android中AsyncTask使用
  3. Sprint.Net 笔记
  4. STL中的map/multimap小结
  5. 大型网站系统架构实践(五)深入探讨web应用高可用方案
  6. 发个题目坑 二模03day1
  7. php中的 == 和 ===
  8. 关于Java Collections API您不知道的5件事,第2部分
  9. Sudoku(回溯)
  10. Codeforces 138D World of Darkraft
  11. 无法加载协定为“XXXWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置
  12. ubuntu下安装memcached与php扩展测试使用
  13. jQuary学习の三の效果展示
  14. 15_Python模块化编程_Python编程之路
  15. VS2012发布网站详细步骤问题
  16. 【转】ContextLoaderListener和DispatcherServlet加载内容的区别
  17. Matplotlib学习---用matplotlib画误差线(errorbar)
  18. HDU 4612 Warm up 连通图缩点
  19. 【LeetCode two_pointer】11. Container With Most Water
  20. Log4Net使用教程

热门文章

  1. 安装routeos
  2. TZOJ 二分图练习
  3. swift - 本地通知
  4. netty 之 传统的阻塞io 体系回顾
  5. js实现各种复制到剪贴板的方法
  6. 【gRPC使用问题2】按照问题1操作生成出来的代码,import的proto内定义的message未生成出来
  7. Oracle性能优化5-索引的不足
  8. opencv 3.2安装
  9. Android开发之ListView设置隔行变色
  10. HDU_2112(最短路)