Codeforces 939E Maximize ( 三分 || 二分 )
2024-09-02 08:55:07
题意 : 给出两个操作,① 往一个序列集合(初始为空)里面不降序地添加数字、② 找出当前序列集合的一个子集使得 (子集的最大元素) - (子集的平均数) 最大并且输出这个最大差值
分析 :
首先关注到 ① 操作是有序地添加数
然后为了回答 ② 的问询,来分析一波
直觉告诉我们,要最大化差值,选取的子集最大元素应当越大越好
这一点是对的,具体的证明可以看 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()); } } ; }
三分
最新文章
- Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目
- Azure SQL Database (19) Stretch Database 概览
- Docker学习笔记
- Android网络文件下载模块整理
- 百度地图坐标纠偏和转换工具和DLL
- Java语言编码规范(Java Code Conventions)
- NDK: unable to watch local variables after using GCC4.8
- JVM垃圾回收机制总结(4) :新一代的垃圾回收算法
- [Everyday Mathematics]20150117
- Qt creator自定义编译运行步骤
- ios本地文件内容读取,.json .plist 文件读写
- 2016";百度之星"; - 资格赛(Astar Round1) Problem C
- SFTP远程文件上传
- 炫酷MD风之dialog各种对话框
- PHP钩子的简单介绍
- pandas使用lambda判断元素是否为空或者None
- python中的各种模块(np,os,shutill)
- Spring之jdbcTemplate实现orm
- KMP、扩展KMP、Manacher习题
- (弃) Keystone CLI_选项与子命令概况