题意 : 给出两个操作,① 往一个序列集合(初始为空)里面不降序地添加数字、② 找出当前序列集合的一个子集使得 (子集的最大元素) - (子集的平均数) 最大并且输出这个最大差值

分析 : 

首先关注到 ① 操作是有序地添加数

然后为了回答 ② 的问询,来分析一波

直觉告诉我们,要最大化差值,选取的子集最大元素应当越大越好

这一点是对的,具体的证明可以看 CF 的官方题解

那么也就是说选出的子集里面必定有当前序列集合的最大值元素

然后为了使(子集的平均数)越小,直觉又告诉我们

需要贪心地选择小的元素加入子集,这一点是显然的

仔细一想就能发现,如果我们从小到大地将元素加入子集

子集的平均数肯定是先减后增,是个凹函数

又因为是序列有序,所以我们可以去三分序列的前缀和数组寻找凹点

最后的答案就是 (集合序列最大值) - (凹点的平均值)

至于二分解法,也同样是和上面一个道理

我们可以去二分前缀和数组的一个位置,假设为 POS

如果算出来的平均值比 POS+1 这个位置的元素更大

说明加入 POS+1 这个元素肯定更优,最后一直二分到合理位置就是答案了

具体看代码

二分 1231ms

#include<bits/stdc++.h>
#define LL long long
using namespace std;
;
vector<LL> arr;
LL Presum[maxn];

inline void GetAns()
{
    , R = arr.size()-, idx = ;
    double avg;
    while(L <= R){
        ;
        avg = (] + Presum[mid]) / ();
        ]) L = mid + ;///平均值比后面的元素更大,说明添加进 mid+1 这个元素肯定更优
        , idx = mid;
    }

    avg = (] + Presum[idx]) / ();
    ] - avg;
    printf("%.9f\n", ans);
}

int main(void)
{
    int Q;
    scanf("%d", &Q);
    while(Q--){
        int command;
        scanf("%d", &command);
        ){
            LL tmp;
            cin>>tmp;
            arr.push_back(tmp);
            Presum[arr.size()-] = ((arr.size()- < ) ?  : Presum[arr.size()-]) + tmp;
        }else GetAns();
    }
    ;
}

二分

三分 514ms

#include<bits/stdc++.h>
#define LL long long
using namespace std;
;
vector<LL> arr;
LL Presum[maxn];

double Fun(int pos)
{ ] + Presum[pos]) / (); }

double GetAns()
{
    , R = arr.size() - ;
    ){
        ;
        ;
        if( Fun(mid) > Fun(mmid) ) L = mid;
        else R = mmid;
    }
    ] - Fun(Fun(L) > Fun(R) ? R : L);
}

int main(void)
{
    int Q;
    scanf("%d", &Q);
    while(Q--){
        int command;
        scanf("%d", &command);
        ){
            LL tmp;
            scanf("%I64d", &tmp);
            arr.push_back(tmp);
            Presum[arr.size()-] = (arr.size()- <  ?  : Presum[arr.size()-]) + tmp;
        }else{
            printf("%.9f\n", GetAns());
        }
    }
    ;
}

三分

Codeforces 939E Maximize ( 三分 || 二分 )的更多相关文章

  1. 2018.12.08 codeforces 939E. Maximize!(二分答案)

    传送门 二分答案好题. 题意简述:要求支持动态在一个数列队尾加入一个新的数(保证数列单增),查询所有子数列的 最大值减平均值 的最大值. 然而网上一堆高人是用三分做的. 我们先考虑当前的答案有可能由什 ...

  2. Codeforces 939E Maximize! (三分 || 尺取)

    <题目链接> 题目大意:给定一段序列,每次进行两次操作,输入1 x代表插入x元素(x元素一定大于等于之前的所有元素),或者输入2,表示输出这个序列的任意子集$s$,使得$max(s)-me ...

  3. Codeforces 939E - Maximize!

    939E - Maximize! 思路: 贪心:最后的集合是最大值+前k小个 因为平均值时关于k的凹形函数,所以可以用三分求最小值 又因为后面的k肯定比前面的k大,所以又可以双指针 三分: #incl ...

  4. codeforces 939E Maximize! 双指针(two pointers)

    E. Maximize! time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  5. HDU 2298 Toxophily(公式/三分+二分)

    Toxophily Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. [Codeforces 1199C]MP3(离散化+二分答案)

    [Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...

  7. Codeforces 8D Two Friends 三分+二分+计算几何

    题目链接:点击打开链接 题意:点击打开链接 三分house到shop的距离,二分这条斜边到cinema的距离 #include<stdio.h> #include<string.h& ...

  8. codeforces#1139E. Maximize Mex(逆处理,二分匹配)

    题目链接: http://codeforces.com/contest/1139/problem/E 题意: 开始有$n$个同学和$m$,每个同学有一个天赋$p_{i}$和一个俱乐部$c_{i}$,然 ...

  9. CodeForces 939E Maximize

    Maximize 题意:整个程序有2种操作,操作1将一个元素放入集合S中,且保证最新插入的元素不小于上一次的元素, 操作2 找到集合S中的某个子集合, 使得 集合中最大的元素减去平均数的值最大. 题解 ...

随机推荐

  1. 【神经网络与深度学习】【CUDA开发】【VS开发】Microsoft官方移植了Caffe配置过程说明

    想在Windows平台使用Caffe,吭哧吭哧下载了半天第三方库,后来忽然发现Microsoft官方移植了Caffe,配置起来简直太省心了- 1. 从Microsoft官方Github上下载Caffe ...

  2. spring boot 数据源配置YAML格式

    spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf- ...

  3. tomcat的相关

    [针对tomcat修改,那么就直接找关于tomcat的相关文件目录进行修改即可] 1.对tomcat进行相关的操作,启动tomcat时,让其不要出现tomcat主页,与之相反的让其出现404的界面! ...

  4. 【五一qbxt】test2

    又犯了一些迷之错误??要不然yy鼠标就是我的了 1.Superman: 小姐姐的题解:直接用set模拟即可emmmm 里面有很多指针啊,乱七八糟的,不会qwq,先看看我的大模拟吧: #include& ...

  5. IDEA Maven项目 pom.xml 找不到 Dependency 依赖

    转载: IDEA Maven项目 pom.xml 找不到 Dependency 依赖 如果你的pom.xml中使用了dependencyManagement管理依赖并且添加了你本地仓库中不存在的依赖可 ...

  6. MyBatis时间排序问题

    在数据中create_time字段是DateTime类型, 逆向工程后实体类中对应的成员变量类型为Date 时间排序代码为: 测试结果: 时间排序错乱. 解决方法: 1,在数据库创建varchar类型 ...

  7. laravel的monolog使用

    Laravel 集成了 Monolog 日志函数库,Monolog 支持和提供多种强大的日志处理功能. 1.设置,日志模式 (1)Laravel 提供可立即使用的 single.daily.syslo ...

  8. numpy-数据格式之 int 与 uint

    概念 整型分为 有符号整型 和 无符号整型,其区别在于 无符号整型 可以存放的正数范围 比 有符号整型 大一倍,因为 有符号整型  将最高位存储符号,而 无符号整型 全部存储数字 # 1 111000 ...

  9. 模板 - 强连通分量/割点/桥 - Tarjan

    int dfn[N], low[N], dfncnt, s[N], tp; int scc[N], sc; // 结点 i 所在 scc 的编号 int sz[N]; // 强连通 i 的大小 voi ...

  10. xampp配置多域名

    重要的事情: 前提: vhost.conf被引入 修改两个文件,文件所在路径,看图片上sublime编辑器,hosts和vhost.conf配置的域名必须一致 参考文档:http://blog.csd ...