题意

有一个大小为 \(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\)):

\[\begin{align*}
\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的更多相关文章

  1. LeetCode - Two Sum

    Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...

  2. 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 ...

  3. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  4. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  5. BZOJ 3944 Sum

    题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...

  6. [LeetCode] Path Sum III 二叉树的路径和之三

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  7. [LeetCode] Partition Equal Subset Sum 相同子集和分割

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  8. [LeetCode] Split Array Largest Sum 分割数组的最大值

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  9. [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 ...

  10. [LeetCode] Combination Sum IV 组合之和之四

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

随机推荐

  1. Perceptron, Support Vector Machine and Dual Optimization Problem (3)

    Support Vector Machines Perceptron and Linear Separability 假设存在一个 linear decision boundary,它可以完美地对 t ...

  2. R语言文本数据挖掘(三)

    文本分词,就是对文本进行合理的分割,从而可以比较快捷地获取关键信息.例如,电商平台要想了解更多消费者的心声,就需要对消费者的文本评论数据进行内在信息的数据挖掘分析,而文本分词是文本挖掘的重要步骤.R语 ...

  3. Oracle宕机之PMON (ospid: 248987): terminating the instance due to error 484(另附hugepage配置方法)

    数据库版本:11.2.0.4 RAC环境 操作系统版本:Asianux Server release 7.3 数据库报错分析 接到业务消息,应用无法访问,开发人员查看日志后发现无法连接数据库. 查看数 ...

  4. SSM整合的所有配置(配置文件)

    mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE co ...

  5. Rust中的into函数和from函数

    1.Rust中的into函数和from函数是做什么用的? into函数是Rust语言中的一个转换函数,它属于Into trait.它可以将一个类型转换为另一个类型.实现了From trait的类型会自 ...

  6. nginx概要

    新机(CentOS7)配置nginx: 一. 更新yum源为阿里云镜像 ping mirrors.aliyun.com mv /etc/yum.repos.d/CentOS-Base.repo /et ...

  7. Cesium加载ArcGIS Server4490且orgin -400 400的切片服务

    Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时,默认只支持wgs84的4326坐标系,不支持CGCS2000的4490坐标系. 如果是A ...

  8. Prism Sample 22-ConfirmCancelNavigation

    导航到一个视图,如果在离开这个视图时需要确认,在VM中实现以下接口 public class ViewAViewModel : BindableBase, IConfirmNavigationRequ ...

  9. 用Python语言进行时间序列ARIMA模型分析

    应用时间序列 时间序列分析是一种重要的数据分析方法,应用广泛.以下列举了几个时间序列分析的应用场景: 1.经济预测:时间序列分析可以用来分析经济数据,预测未来经济趋势和走向.例如,利用历史股市数据和经 ...

  10. flutter系列之:做一个修改组件属性的动画

    目录 简介 flutter中的动画widget AnimatedContainers使用举例 总结 简介 什么是动画呢?动画实际上就是不同的图片连续起来形成的.flutter为我们提供了一个Anima ...