CF1810H Last Number
大难题,但是非常的有意思。思路来自 \(\color{black}\text{艾}\color{red}\text{利克斯·伟}\)。补充了一点小细节。
题意
对于一个 可重 集合 \(S\),初始为 \(\{1 \dots n\}\),执行以下操作:删除集合中的最大、最小元素 \(S_{min}, S_{max}\),加入 \(S_{max} - S_{min}\)。最终集合只剩下一个元素,输出这个元素。
给定 \(T\) 组 \(n\),分别输出答案,\(1 \le T \le 10^5, 1 \le n \le 10^9\)。
做法
首先观察题目给出的操作序列,容易发现这些操作是分为两部分的。记第 \(i\) 次操作加入的是 \(a_i - b_i\)。存在一个 \(p\) 使得 \(\forall 1 \le i < p\),\(a_i > 2b_i\),并且 \(a_p \le 2b_p\)。那么 \(\forall 1 \le i \le p, b_i = i, a_{i-1} - a_i \in \{0, 1\}\),看起来是很可以做的。
这部分先按下不表,转而考察 \(p < i \le n-1\) 的情况。记第 \(p\) 次操作以后的可重集合是 \(S'\),同时也记它为集合排序后的序列。那么容易得出此时的每次操作以后,新集合的最小值一定是刚加入的数。这个直觉的来源是,加入的数整体而言在不断变小。事实上可以证明,由于最大值不减,所以每两轮,加入的数一定不减;而第 \(p\) 和 \(p+1\) 次操作都保证生成的数是集合最小值——所以接下来的过程中它始终保持最小。有了这个结论,我们可以优美地描述后半部分操作:\(Ans = S'_2 - (S'_3 - (S'_4 - \dots (S'_{n-p} - S'_1)\dots))\)。
接下来,考虑前半部分操作。首先,\(b_i = i, a_{i-1} - a_i \in \{0, 1\}\) 告诉我们,每一次生成的数都会变小 \(1\) 或 \(2\)。那么从大到小扫描值域的过程中,每次碰到的数都要么有一个要么有两个。一旦生成了一个数,这个数和它后面的所有数的个数都确定下来了。所以考虑依次确定这些数的个数。记 \(d_i = a_{i-1}-a_i\),则若 \(d_i = 0\),被确定的数是 \(a_i - i\) 有两个;否则被确定的是 \(a_i - i\) 有两个,\(a_i - i + 1\) 有一个。考虑维护 \(d\) 而不是 \(a\)。那么相当于我扫描到一个 \(0\) 就加入 \(10\),扫描到一个 \(1\) 就加入 \(110\)。考虑 \(d\) 序列的前几项:
\]
你可以把生成 \(d\) 的过程分段化,设 \(Q_i\) 表示第 \(i\) 阶段生成的串,那么它前缀依次拼接得到的就是 \(d\) 序列。\(Q_{i+1}\) 是由 \(Q_i\) 中所有 \(0\) 替换成 \(10\),所有 \(1\) 替换成 \(110\) 得到的。生成这种东西,不要依次递推,而是考虑从开头插入操作。具体地,记 \(f_{0/1, i}\) 表示一开始为 \(0/1\) 进行 \(i\) 次迭代得到的东西,那么 \(Q_i = f_{0, i}\)。则存在递推:
f_{0, i} = f_{1, i-1} + f_{0, i-1}\\
f_{1, i} = f_{1, i-1} + f_{1, i-1} + f_{0, i-1}
\end{cases}
\]
那么我们就获得了一种优雅的方法生成 \(Q\),可以借此获得 \(d\) 的前缀信息。
接下来,只需要结合上面对于后半部分操作的结论即可。容易得出,考虑我们在第 \(p\) 次操作结束后生成的 \(d\) 所对应的 \(a\) 序列。则上述的 \(S'_1 = a_p - p \le p\),而 \(S'_i = a_{n-i+1}(2 \le i \le n-p)\)。所以:
Ans &= a_{n-1} - (a_{n-2} - (a_{n-3} - \dots (a_{p+1} - (a_p - p))\dots))\\
&= (-1)^{n-p}p +\sum\limits_{i = p}^{n-1} (-1)^{n-i+1}a_i\\
&= \begin{cases}
p-s_{n-1}-s_{n−3}-\dots-sp+1p−sn−1−sn−3−\dots−sp+1。
\end{cases}
\end{align*}
\]
CF1810H Last Number的更多相关文章
- JavaScript Math和Number对象
目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...
- Harmonic Number(调和级数+欧拉常数)
题意:求f(n)=1/1+1/2+1/3+1/4-1/n (1 ≤ n ≤ 108).,精确到10-8 (原题在文末) 知识点: 调和级数(即f(n))至今没有一个完全正确的公式, ...
- Java 特定规则排序-LeetCode 179 Largest Number
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- Eclipse "Unable to install breakpoint due to missing line number attributes..."
Eclipse 无法找到 该 断点,原因是编译时,字节码改变了,导致eclipse无法读取对应的行了 1.ANT编译的class Eclipse不认,因为eclipse也会编译class.怎么让它们统 ...
- 移除HTML5 input在type="number"时的上下小箭头
/*移除HTML5 input在type="number"时的上下小箭头*/ input::-webkit-outer-spin-button, input::-webkit-in ...
- iOS---The maximum number of apps for free development profiles has been reached.
真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...
- 有理数的稠密性(The rational points are dense on the number axis.)
每一个实数都能用有理数去逼近到任意精确的程度,这就是有理数的稠密性.The rational points are dense on the number axis.
- [LeetCode] Minimum Number of Arrows to Burst Balloons 最少数量的箭引爆气球
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- [LeetCode] Number of Boomerangs 回旋镖的数量
Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...
- [LeetCode] Number of Segments in a String 字符串中的分段数量
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
随机推荐
- KVM WEB管理工具 WebVirtMgr
一.webvirtmgr介绍及环境说明 温馨提示:安装KVM是需要2台都操作的,因为我们是打算将2台都设置为宿主机所有都需要安装KVM相关组件 github地址https://github.com/r ...
- [设计模式/网络/WebServer/Nginx]设计模式之代理模式(网络代理 : 正向代理与反向代理)【7】
1 代理模式 1.1 模式定义 代理模式(Proxy Pattern):为其他对象提供一种代理服务以对这个被代理的对象进行控制访问.[ 设计模式.面向对象程序设计思想的鼻祖----GoF] Subje ...
- 列表、sort、reverse、元组、字典、
1.列表是一种有序可变的容器.通过[]来标识 1)定义一个空列表list = [] 2.列表的添加 1)末尾添加append() list = ['张三',,'王五'] list.append('刘六 ...
- 安全测试前置实践1-白盒&黑盒扫描
作者:京东物流 陈维 一.引言 G.J.Myers在<软件测试的艺术>中提出:从心理学角度来说,测试是一个为了寻找错误而运行程序的过程. 那么安全测试则是一个寻找系统潜在安全问题的过程,通 ...
- Redis源码之SDS简单动态字符串
Redis 是内存数据库,高效使用内存对 Redis 的实现来说非常重要. 看一下,Redis 中针对字符串结构针对内存使用效率做的设计优化. 一.SDS的结构 c语言没有string类型,本质是ch ...
- mysql 命令批量修改一个字段/帝国cms sql命令修改一个字段
UPDATE phome_enewstagsdata SET classid=5 where classid=1 UPDATE phome_ecms_news SET classid=8 where ...
- 自定义Feign拦截器
简介 Feign的拦截器RequestInterceptor SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置head ...
- Java的final修饰符
final 实例域 可以将实例域定义为 final.对于 final 域来说,构建对象时必须初始化 final 实例域,构造对象之后就不允许改变 final 实例域的值了.也就是说,必须确保在每一个构 ...
- js与java对json的操作
JSON呢,是现在大部分,并且主流的传递数据的方式. 今天讲一下javascript的java对json的操作 提到js,当下就有一个比较主流的插件,vue.js,这个插件程序员没用过也都听说过吧, ...
- 深度学习03-(图像梯度处理、图像轮廓、图像预处理在AI中的应用)
深度学习03-计算机视觉基本理论2 深度学习03-(计算机视觉基本理论2) 图像梯度处理 什么是图像梯度 模板运算 均值滤波 高斯滤波 中值滤波 边沿检测 锐化 图像轮廓 什么是图像轮廓 查找和绘制轮 ...