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 ...
随机推荐
- keyclaok~keycloak存到cookie中的值和session_state
keycloak存到cookie中的值 AUTH_SESSION_ID KEYCLOAK_IDENTITY KEYCLOAK_SESSION AUTH_SESSION_ID 用户的当前session_ ...
- selenium中处理验证码问题1-获取验证码图片
selenium中处理验证码问题: 验证码: 基本作用:可以实现当前访问页面的数据安全性.还可以减少用户的并发数:实现大流量的分流 类型:1.纯数字.纯字母 2.汉字组合 3.数学运算题 4.滑动 5 ...
- kubernetes核心实战(一)--- namespace
kubernetes核心实战 1.资源创建方式 命令行创建 yaml文件创建 2.namespace 命名空间(namespace)是Kubernetes提供的组织机制,用于给集群中的任何对象组进行分 ...
- 解Bug之路-应用999线升高
前言 监控指标诚然是发现问题于微末之时的极佳手段,但指标往往有其表达的极限.在很多情况下,单独看一个黄金指标并不能表征系统的健康程度,反而有可能被其迷惑,进而忽略相关问题.(本文所提及的Linux K ...
- 被吐槽 GitHub仓 库太大,直接 600M 瘦身到 6M,这下舒服了
大家好,我是小富- 前言 忙里偷闲学习了点技术写了点demo代码,打算提交到我那 2000Star 的Github仓库上,居然发现有5个Issues,最近的一条日期已经是2022/8/1了,以前我还真 ...
- 【c#表达式树】最完善的表达式树Expression.Dynamic的玩法
引言 在我第一次写博客的时候,写的第一篇文章,就是关于表达式树的,链接:https://www.cnblogs.com/1996-Chinese-Chen/p/14987967.html,其中,当时一 ...
- ORA-19870: error while restoring backup piece 数据库恢复报错
问题描述:用备份进行DG恢复,恢复过程中报错ORA-19870: error while restoring backup piece /backup/db_BJCCORA_20180724_02t8 ...
- Redis 日志showlog 和 管道pileline
redis日志 slowlog-log-slower-than:指定执行时间超过多少微秒(1秒等于1000000微秒) 的命令请求会被记录到日志上 slowlog-max-len:指定服务器最多保存多 ...
- Prism Sample 12-UsingCompositeCommands
本例中,主页是一个按钮,绑定了一个复合命令,然后下面一个TabControl <Grid> <Grid.RowDefinitions> <RowDefinition He ...
- 2022-04-24:位集 Bitset 是一种能以紧凑形式存储位的数据结构。 请你实现 Bitset 类。 Bitset(int size) 用 size 个位初始化 Bitset ,所有位都是 0
2022-04-24:位集 Bitset 是一种能以紧凑形式存储位的数据结构. 请你实现 Bitset 类. Bitset(int size) 用 size 个位初始化 Bitset ,所有位都是 0 ...