CF1817E Half-sum 另解与 Trygub Number
一题水两篇怎么说。
上一篇中我们采用智慧方法减少了比较次数,避免了使用复杂的高精度数。现在我们有高论!可以做到 \(\mathrm O(\log_B V\log_2 n)\) 在某一位加或者减一个大小 \(\mathrm O(V)\) 的数,支持判断正负和取特定位的值。怎么做呢。很简单,我们每一位的数值域原本是 \([0, B)\),其中 \(B\) 是进制,现在我们改成 \((-B, B)\)。你发现这样一个数的正负性依然只和最高非零位置有关,某一位的具体值,只会受到上一个非零位的退位影响,那么用 set 存一下非零位置即可。在这道题,加的数是 \(5\times 10^8\)。进行一个位的压,那么你可以把 \(V\) 搞到 \(\Theta(B)\),于是单 \(\log\) 就暴力过了这个题。下面证明为啥加减这么快!
考虑当前我们在某一位要加上一个数 \(X\),如果 \(|X| \ge B\) 那么它会除以 \(B\) 下取整以后再被扔到下一位;由于当前位可能有数所以它的大小还可能增加 1,但是由于级数 \(\sum\limits_{i=0}^{\infty}B^{-i}\) 狠狠地收敛,所以 \(|X| \ge B\) 的时候这个增加 1 没有啥存在感。这一部分消耗的复杂度也就是 \(\log_B V\log_2 n\)(后一个 \(\log\) 来自对 set 的操作)。那么考虑 \(|X| < B\) 的时候会发生啥。容易得出你会往前进位,进的数只可能是 \(\pm 1\),单次消耗复杂度是 \(\log_2 n\)。于是一般的时候你就停下来了,但是也有可能不停进位,发生链式反应!也就是当某一位恰好是 \(\pm(B-1)\) 的时候。定义这样的位是“临界状态”位。那么发生一次额外的进位消耗至少一个临界状态的位。于是你考虑均摊分析。什么时候我们会增加临界状态的位呢?容易得出,前面当 \(|X| \ge B\) 的时候每一次都可能增加一个,而在进位过程中,我们顶多在最后一次进位停下来的时候产生一个临界位。所以最后临界位的总个数是均摊 \(\log_B V\) 的。那么均摊复杂度正确,完全胜利!
贴一下 CF 上的原文。
CF1817E Half-sum 另解与 Trygub Number的更多相关文章
- 求和函数 sum详解
sum()的参数是一个list: >>> sum([1,2,3]) 6 >>> sum(range(1,3)) 3 还有一个比较有意思的用法 a = range(1 ...
- 详解JS中Number()、parseInt()和parseFloat()的区别
三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt().parseFloat(): 专门用于把字符串转换成数值: 一.Number( ): (1)如果是Boolean ...
- Leetcode 详解(Valid Number)
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- Python3解leetcode Single Number
问题描述: Given a non-empty array of integers, every element appears twice except for one. Find that sin ...
- [LintCode] Minimum Size Subarray Sum 最小子数组和的大小
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- hdu 1047 (big integer sum, fgets or scanf, make you func return useful infos) 分类: hdoj 2015-06-18 08:21 39人阅读 评论(0) 收藏
errors made, boundary conditions, <= vs < , decreasing vs increasing , ++, –, '0'/'1' vs 0/1 p ...
- Modify the average program to promote for intergers repeatedly.stop when a nagetive number is entere
#include<stdio.h> int main(void) { intcount ,sum,aninterger; printf("enterthe interger an ...
- LeetCode 202. Happy Number (快乐数字)
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- Leetcode_202_Happy Number
+ 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1 思路: (1)题意为判断给定的整数是否为一个"快乐的数",所谓快乐的数需 ...
- 136.137.260. Single Number && 位运算
136. Single Number 意思就是给你一堆数,每个数都出现了两次,只有一个数只出现了一次,找出这个数 位运算(和c艹一样) &:按位与 |:按位或 ^:异或(一样为0,不一样为1) ...
随机推荐
- 学习httprunner遇到的问题记录
今天研究httprunner遇到了几个问题 1.问题1: 最新的版本4.3.0已经舍弃了locusts,har2case这两个东西 导致运行的时候,出现har2case不是内部命令 一开始以为是没有配 ...
- Low-Code,一定“low”吗?
作者:京东保险 吴凯 前言 低代码是一组数字技术工具平台,基于图形化拖拽.参数化配置等更为高效的方式,实现快速构建.数据编排.连接生态.中台服务.通过少量代码或不用代码实现数字化转型中的场景应用创新. ...
- 方差分析3——正交表与正交实验设计(R语言)
正交试验设计(orthogonal design简称正交设计(orthoplan),是利用正交表(orthogonal table)科学地安排与分析多因素试验的方法,是最常用的试验设计之一.正交表是一 ...
- pnpm 之降本增效
作者:京东科技 于振京 受众简介 前端研发工程师 还在为npm i安装大量依赖等待时间较长,npm扁平化node_modules依赖版本冲突在苦恼吗,不用苦恼pnpm为你保驾护航 主要影响:安装依赖包 ...
- bash shell 无法使用 perl 正则
哈喽大家好,我是咸鱼.今天跟大家分享一个关于正则表达式的案例,希望能够对你有所帮助 案例现象 前几天有一个小伙伴在群里求助,说他这个 shell 脚本有问题,让大家帮忙看看 可以看到,这个脚本首先 ...
- .NET周报 【4月第3期 2023-04-15】
国内文章 Semantic Kernel 入门系列: Planner 规划器 https://www.cnblogs.com/xbotter/p/semantic_kernel_introductio ...
- Android刷机日记
0x01 工具准备(镜像之类的注意下载的版本要与手机一致) 1)SDK工具 https://developer.android.com/studio/releases/platform-tools?h ...
- 【LeetCode动态规划#12】详解买卖股票I~IV,经典dp题型
买卖股票的最佳时机 力扣题目链接(opens new window) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入 ...
- MySQL事务和锁实战篇
文章目录 MySQL事务和锁 事务 事务的控制语句 事务隔离级别设置 脏读 不可重复读 幻读 锁机制 InnoDB的行级锁 锁实战 死锁 总结 MySQL事务和锁 事务 说到关系型的数据库的事务,相信 ...
- 超声波、毫米波、ToF激光雷达——在低功耗场景的应用选型
前言: 目前主要的测距方式有:光学测距,超声波和微波雷达测距. 光学测距又可以分为:双目,结构光,ToF.微波雷达,在消费类产品中,常见的是波长在毫米级别的毫米波雷达.超声波应用比较多的是在车载倒车雷 ...