[codeforces] 578C Weakness and Poorness || 三分
原题
题目定义了两个变量:
poorness表示一个区间内和的绝对值。
weakness表示一个所有区间最大的poornesss
题目要求你求一个x使得
a1 − x, a2 − x, ..., an − x这个序列的weakness最小
输出最小的weakness
显然,所求值是这样的一个函数

(因为是对abs取max,所以不可能出现有两个谷的不符合要求的函数)
所以我们可以三分,只有当x为ans时,我们才会得到最小值。
已知x时,如何求解最大子段和呢?,因为我们是取abs,所以在记录b[i]为前缀和时,b[i]为结尾的最大子段和要么由前面最小的b[]得到,要么由前面最大的b[]得到。所以我们只要O(n)前缀和然后枚举判断找答案就可以了。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 2000010
#define eps 3e-12
using namespace std;
int n,a[N];
double l,r,b[N];
int read()
{
    int ans=0,fu=1;
    char j=getchar();
    for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
    if (j=='-') fu=-1,j=getchar();
    for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
    return ans*fu;
}
double check(double x)
{
    double mn=100000,mx=-100000,ans=0;
    for (int i=1;i<=n;i++) b[i]=(double)a[i]-x;
    for (int i=1;i<=n;i++) b[i]+=b[i-1];
    ans=fabs(b[1]),mn=min(0.0,b[1]),mx=max(0.0,b[1]);
    for (int i=2;i<=n;i++) {
	ans=max(ans,fabs(b[i]-mn));
	ans=max(ans,fabs(b[i]-mx));
	mn=min(mn,b[i]),mx=max(mx,b[i]);
    }
    return ans;
}
int main()
{
    while (~scanf("%d",&n))
    {
	for (int i=1;i<=n;i++)
	    a[i]=read();
	l=-100000;
	r=100000;
	while (r-l>eps)
	{
	    double midl=l+(r-l)/3;
	    double midr=r-(r-l)/3;
	    if (check(midl)<check(midr)) r=midr;
	    else l=midl;
	}
	printf("%.9lf\n",check(l));
    }
    return 0;
}
												
											[codeforces] 578C Weakness and Poorness || 三分的更多相关文章
- codeforces 578c - weekness and poorness - 三分
		
2017-08-27 17:24:07 writer:pprp 题意简述: • Codeforces 578C Weakness and poorness• 给定一个序列A• 一个区间的poornes ...
 - codeforces 578c//Weakness and Poorness// Codeforces Round #320 (Div. 1)
		
题意:一个数组arr,一个数字x,要使arr-x的最大子段最小,问该最小值. 三分x,复杂度logn,内层是最大子段的模板,只能用n复杂度的.因为是绝对值最大,正负各求一次,取大的.精度卡得不得了,要 ...
 - Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C. Weakness and Poorness 三分 dp
		
C. Weakness and Poorness Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
 - Codeforces Round #320 (Div. 2) [Bayan Thanks-Round]  E. Weakness and Poorness 三分
		
E. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
 - Codeforces E. Weakness and Poorness(三分最大子列和)
		
题目描述: E. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes inp ...
 - cf578c Weakness and Poorness 三分
		
其实三分就是一个求单峰函数的最值的东西,用法比较统一.这个题就是观察发现不美好值是一个单峰函数,然后枚举t进行三分就行了. 题干: 给定一个长度为n的数组ai,求一个实数x,使得序列a1-x,a2-x ...
 - Codeforces 578.C Weakness and Poorness
		
C. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
 - 【CodeForces】578 C. Weakness and Poorness
		
[题目]C. Weakness and Poorness [题意]给定含n个整数的序列ai,定义新序列为ai-x,要使新序列的最大子段和绝对值最小,求实数x.n<=2*10^5. [算法]二分| ...
 - Weakness and Poorness CodeForces - 578C  三分搜索 (精度!)
		
You are given a sequence of n integers a1, a2, ..., an. Determine a real number x such that the weak ...
 
随机推荐
- ES6初识-函数扩展
			
默认值 function test(x,y='world'){ console.log('默认值'); } function test2(...arg){ for(let v of arg){ con ...
 - pdo->prepare 返回false的问题总结
			
报错信息: Fatal error: Call to a member function execute() on a non-object 一般是pdo->prepare 返回了false导致 ...
 - >题解< 校门外的树
			
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米.我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 LL 的位置:数轴上的每个整数点,即 0,1 ...
 - elasticsearch-dsl笔记
			
一.elasticsearch安装 安装java1.8以上 安装elasticsearch-rtf(https://github.com/medcl/elasticsearch-rtf) head插件 ...
 - 网页更换主题以及绘制图形js代码实现
			
HTML代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
 - Linux文件系统与目录结构
			
在Linux系统中,目录被组织成一个:单根倒置树结构,文件系统从根目录开始,用/来表示.文件名称区分大小写( 大小写敏感还需要看具体的文件系统格式 ),以.开头的为隐藏文件,路径用/来进行分割(win ...
 - 汇编:输出寄存器AX中的内容
			
DATAS segment Temp db '0000H','$' DATAS ends CODES segment START: mov AX,DATAS mov DS,AX ;正式代码开始 mov ...
 - PHP的IMAP函数
			
imap_8bit -转换的8位字符串的引用,打印字符串 imap_alerts -返回所有的I MAP邮件警报已经发生 imap_append -附加了一系列的信息到指定邮箱 imap_base64 ...
 - JZOJ  5914. 盟主的忧虑
			
Description 江湖由 N 个门派(2≤N≤100,000,编号从 1 到 N)组成,这些门派之间有 N-1 条小道将他们连接起来,每条道路都以“尺”为单位去计量,武林盟主发现任何两个 ...
 - Python元组,列表,字典,集合
			
1.元组 元组是有序的,只有index和count两种方法,一看到元组,就提醒是不可更改的 names = ('wll', 'ly', 'jxx', 'syq') (1)index方法 print(n ...