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 ...
随机推荐
- 机器学习08DAY
线性回归 波士顿房价预测案例 步骤 导入数据 数据分割 数据标准化 正规方程预测 梯度下降预测 # 导入模块 import pandas as pd # 导入数据 from sklearn.model ...
- 普冉PY32系列(七) SOP8, SOP10和SOP16封装的PY32F003/PY32F002A管脚复用
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- 电商AARRR模型分析(二)—R语言
AARRR模型可以说是用户运营和业务增长非常重要的模型.模型以用户的生命周期为核心,把增长步骤拆分为5个步骤,分别是:获取用户(Acquisition).用户激活(Activiation).用户留存( ...
- mysql的concat与concat_ws拼接字符串的使用
concat的使用 可以拼接多个字符 mysql> select concat(name,dept,job) from t1; +-----------------------+ | conca ...
- Helm 安装 Kubernetes 监控套件
Helm 安装 Grafana Prometheus Altermanager 套件 安装helm # 安装helm工具 curl -fsSL -o get_helm.sh https://raw.g ...
- 学习docker看此文足以
什么是 Docker Docker 最初是 dotCloud 公司创始人 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 ,主要项目代码在 上进行 ...
- 四月十二号java基础知识
1.面向对象的编程思想是力图使在计算机语言中对事物的描述与现实世界中该事物的本来面目尽可能地一致.2.类(class)和对象(object)是面向对象程序设计方法中最核心的概念3.类是对某一事物的描述 ...
- Java设计模式 —— 单例模式
6 单例模式 6.1 单例模式概述 Singleton Patter:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例. 单例模式有3个要点: 该类只能有一个实例 该类必须自行创建这个实 ...
- el-menu使用递归组件实现多级菜单组件
1. 效果: 2. 实现: 创建外层菜单AsideMenu.vue组件和子菜单项AsideSubMenu.vue组件,在AsideSubMenu中进行递归操作. AsideMenu.vue文件内容如下 ...
- 如何在现有项目中使用`Masa MiniApi`?
首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFramework的MiniApi的包 创建Asp.NET Cor ...