Codeforces 939E Maximize ( 三分 || 二分 )
题意 : 给出两个操作,① 往一个序列集合(初始为空)里面不降序地添加数字、② 找出当前序列集合的一个子集使得 (子集的最大元素) - (子集的平均数) 最大并且输出这个最大差值
分析 :
首先关注到 ① 操作是有序地添加数
然后为了回答 ② 的问询,来分析一波
直觉告诉我们,要最大化差值,选取的子集最大元素应当越大越好
这一点是对的,具体的证明可以看 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 ( 三分 || 二分 )的更多相关文章
- 2018.12.08 codeforces 939E. Maximize!(二分答案)
传送门 二分答案好题. 题意简述:要求支持动态在一个数列队尾加入一个新的数(保证数列单增),查询所有子数列的 最大值减平均值 的最大值. 然而网上一堆高人是用三分做的. 我们先考虑当前的答案有可能由什 ...
- Codeforces 939E Maximize! (三分 || 尺取)
<题目链接> 题目大意:给定一段序列,每次进行两次操作,输入1 x代表插入x元素(x元素一定大于等于之前的所有元素),或者输入2,表示输出这个序列的任意子集$s$,使得$max(s)-me ...
- Codeforces 939E - Maximize!
939E - Maximize! 思路: 贪心:最后的集合是最大值+前k小个 因为平均值时关于k的凹形函数,所以可以用三分求最小值 又因为后面的k肯定比前面的k大,所以又可以双指针 三分: #incl ...
- codeforces 939E Maximize! 双指针(two pointers)
E. Maximize! time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
- HDU 2298 Toxophily(公式/三分+二分)
Toxophily Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- [Codeforces 1199C]MP3(离散化+二分答案)
[Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...
- Codeforces 8D Two Friends 三分+二分+计算几何
题目链接:点击打开链接 题意:点击打开链接 三分house到shop的距离,二分这条斜边到cinema的距离 #include<stdio.h> #include<string.h& ...
- codeforces#1139E. Maximize Mex(逆处理,二分匹配)
题目链接: http://codeforces.com/contest/1139/problem/E 题意: 开始有$n$个同学和$m$,每个同学有一个天赋$p_{i}$和一个俱乐部$c_{i}$,然 ...
- CodeForces 939E Maximize
Maximize 题意:整个程序有2种操作,操作1将一个元素放入集合S中,且保证最新插入的元素不小于上一次的元素, 操作2 找到集合S中的某个子集合, 使得 集合中最大的元素减去平均数的值最大. 题解 ...
随机推荐
- 【VS开发】设置文档标题
[注意]我们注意到我们的文档的创建的时候我们会发现系统会去调用Doc类中的OnNewDocument函数,这里我们知道他是一个虚函数,我们可以在这里设置我们的文档的标题. 代码如下: BOOL CGr ...
- Spring Boot 2.0 多数据源编程
多数据源配置 创建一个Spring配置类,定义两个DataSource用来读取application.properties中的不同配置.如下例子中,主数据源配置为spring.datasource.p ...
- [CF750G] New Year and Binary Tree Paths
目录 简单的 组合的 题目链接 简单的 设从节点\(x\)开始不断往左儿子走h-1步,则编号和为\(x\sum_{i=0}^{h-1}2^i=x(2^h-1)\). 若倒数第\(i\)步走向的是右儿子 ...
- python pycharm 注册码
D87IQPUU3Q-eyJsaWNlbnNlSWQiOiJEODdJUVBVVTNRIiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...
- The Preliminary Contest for ICPC Asia Shanghai 2019 A. Lightning Routing I
传送门 因为某些原因,所以我就去学了 $LCT$ 维护直径, $LCT$ 维护直径我上一个博客讲得很详细了:传送门 这里维护虚儿子用的是 $multiset$ ,没写可删堆 #include<i ...
- 02、CDF文件
有了探针排布图像的基础,我们就可以更好地理解CDF文件了.假如每个探针的位置用一个坐标表示,以左上角为(0,0),那么整张芯片的坐标就如下图(行数n必须等于列数m,这里共有n*m个探针): 0,0 1 ...
- for XML path 使用技巧
FOR XML PATH 是sqlserver数据库的语法,能将查询出的数据转换成xml格式的数据. 首先,我们来看一个正常的查询: SELECT TOP 2 id, name,crDate FROM ...
- 外壳程序(shell):命令解释器commond
在Linux系统中有好几种shell,常见的有:ash.bash.zsh.ksh.tcsh等,计算机一般默认的是bash,使用命令echo $SHELL可以看出我们使用的哪种shell
- python中逐行打印
方法一:readline函数 f = open("./code.txt") # 返回一个文件对象 line = f.readline() # 调用文件的 readline()方法 ...
- mariadb数据库简介
mariadb(默认端口3306) 什么是数据库? 白话:用来存放数据的仓库,这个仓库只不过是按照一定的数据结构来组织. 数据库模型分为三种: 层次式数据库 网络式数据库 关系型数据库和非关系数据库 ...