CF1817E Half-sum
题意
有一个大小为 \(N\) 的非负整数集合 \(A\),每次你可以从集合中取任意两个数,并将它们的平均数放回序列。不停操作,知道集合最后剩下两个数。请求出这两个数的差的绝对值的最大值对 \(10^9+7\) 取模的结果。
数据范围:\(1\le N\le 10^6, 0\le A_i\le 10^9\)。
做法
首先给 \(A\) 排序,最后一定会把一个前缀合并到一个数里,剩下的后缀合并到另一个数里。合并顺序可以改变不同的数所占比例。贪心地思考,容易得出对于前缀一定是从后往前合并,对于后缀一定是从前往后合并。也就是假设 \(A_{1\dots k}(1<k<n)\) 合并到一起,那么 \(A_i(1\le i < k)\) 的系数是 \(2^{-i}\),\(A_j(k+1 < j\le n)\) 的系数是 \(2^{-(n-i+1)}\)。中间两个数比较特殊,\(A_k\) 系数是 \(2^{-(k-1)}\),\(A_{k+1}\) 的系数是 \(2^{-(n-k-1)}\)。
你发现直接枚举 \(k\) 去计算答案,这是不好做的,因为精度不够,你最后输出结果是取模的,必须绝对精确。你当然可以写二进制高精度数,然后你会发现你不能支持 \(\log A\) 加减的同时 \(\log A\) 比较,除非去写线段树之类;总之这不是上策。
那么怎么办呢?考虑边界从 \(p\) 移动到 \(q(q>p)\) 的时候答案的变化量(设 \(D_i = A_{i+1} - A_i\)):
\Delta_{p,q} &= \sum\limits_{i = p}^{q-1}\frac{A_i}{2^i}-(\frac{A_{i+1}}{2^i}+\frac{A_{i+1}}{2^{n-i-1}})+\frac{A_{i+2}}{2^{n-i-1}}\\
&= \sum\limits_{i = p}^{q-1}\frac{D_i}{2^i}-\frac{D_{i+1}}{2^{n-i-1}}\\
&= \frac{D_p}{2^p} - \frac{D_q}{2^{n-q}} + \sum\limits_{i = p+1}^{q-1}(\frac1{2^i} - \frac1{2^{n-i}})D_i
\end{align*}
\]
你发现一个事情叫做,下面的 2 的次数相差很大,而你给定的数值域只有 \(10^5\),那有一些东西是显然不优的。比如说当 \(q \le \dfrac{n-32}2\) 的时候,如果存在一个 \(p < q\) 使得 \(D_p > 0\),那这个 \(q\) 就直接没用了。后半部分同理。于是你只需要无条件计算出中间三十个,然后寻找左半部分和右半部分第一个 \(D_i > 0\) 的位置计算出来即可。于是你可以 \(\Theta(n)\) 去计算高精度数,全部算好以后暴力进位,并一位一位和当前最优解比较。这样时间复杂度是 \(\Theta(n\log V)\)。啥都不用写,很赚。
CF1817E Half-sum的更多相关文章
- LeetCode - Two Sum
Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
- Leetcode 笔记 112 - Path Sum
题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...
- POJ 2739. Sum of Consecutive Prime Numbers
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ...
- BZOJ 3944 Sum
题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...
- [LeetCode] Path Sum III 二叉树的路径和之三
You are given a binary tree in which each node contains an integer value. Find the number of paths t ...
- [LeetCode] Partition Equal Subset Sum 相同子集和分割
Given a non-empty array containing only positive integers, find if the array can be partitioned into ...
- [LeetCode] Split Array Largest Sum 分割数组的最大值
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- [LeetCode] Sum of Left Leaves 左子叶之和
Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...
- [LeetCode] Combination Sum IV 组合之和之四
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
随机推荐
- Thinkpad T14升级Windows11ver22h2失败问题解决小记
背景 手头的ThinkPad在近一年的时间里每次升级Windows 11的22h2版本每次都会报错,具体有以下几种情况: 更新过程中无问题,重启后黑屏更新过程中会卡在26%左右,然后蓝屏报KENERA ...
- GitLab服务器傻瓜式搭建教程
开始前的准备 需要有一台Linux系统的服务器或虚拟机 QAQ 安装包下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ 注* 本教程无需下载安装 ...
- 二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 --- Ubuntu版
二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 --- Ubuntu版本 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安 ...
- 在k8s(kubernetes) 上安装 ingress V1.1.0
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由.流量路由由 Ingress 资源上定义的规则控制. 下面是一个将所有流量都发送到同一 Service 的简单 Ingre ...
- PVE开启硬件显卡直通功能
首先编辑GRUB配置文件: root@pve:~# vim /etc/default/grub root@pve:~# root@pve:~# cat /etc/default/grub # If y ...
- .NET中使用RabbitMQ总结
目前业界使用较多的消息队列组件有RabbitMQ.ActiveMQ.MSMQ.kafka.zeroMQ等 之间的对比可以看这里 之前搭过ActiveMQ环境带源码 点击这里 后来发现RabbitMQ性 ...
- 解决ffmpeg源码不能编译ffplay问题
虽然不是很大问题,还是记录一下,避免以后忘记!!! 总共两个原因影响了源码编译不能生成ffplay可执行文件,如下: 1.系统中没有安装SDL,直接去官网下载SDL源码编译安装http://www.l ...
- 【机器学习与深度学习理论要点】07.A/B测试的概念及用法
1)什么是A/B测试? A/B测试就是两种模型同时运行,并在实际环境中验证其效果的方式.在互联网公司中,A/B测试是验证新模块.新功能.新产品是否有效,新算法.新模型的效果是否有提升,新设计是否收到用 ...
- [OpenCV-Python] 23 图像变换
文章目录 OpenCV-Python:IV OpenCV中的图像处理 23 图像变换 23.1 傅里叶变换 23.1.1 Numpy 中的傅里叶变换 23.1.2 OpenCV 中的傅里叶变换 23. ...
- 《C和指针》第一章
1 第一章 C标准库中几个常用的IO函数 int puts(void *str): 从str中提取字符直到遇到第一个'\0'为止,将这些字符串加上'\n'后发送给stdout. int main(vo ...