一题水两篇怎么说。

上一篇中我们采用智慧方法减少了比较次数,避免了使用复杂的高精度数。现在我们有高论!可以做到 \(\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的更多相关文章

  1. 求和函数 sum详解

    sum()的参数是一个list: >>> sum([1,2,3]) 6 >>> sum(range(1,3)) 3 还有一个比较有意思的用法 a = range(1 ...

  2. 详解JS中Number()、parseInt()和parseFloat()的区别

    三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt().parseFloat(): 专门用于把字符串转换成数值: 一.Number( ): (1)如果是Boolean ...

  3. Leetcode 详解(Valid Number)

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  4. Python3解leetcode Single Number

    问题描述: Given a non-empty array of integers, every element appears twice except for one. Find that sin ...

  5. [LintCode] Minimum Size Subarray Sum 最小子数组和的大小

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...

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

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

  8. LeetCode 202. Happy Number (快乐数字)

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  9. Leetcode_202_Happy Number

    + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1 思路: (1)题意为判断给定的整数是否为一个"快乐的数",所谓快乐的数需 ...

  10. 136.137.260. Single Number && 位运算

    136. Single Number 意思就是给你一堆数,每个数都出现了两次,只有一个数只出现了一次,找出这个数 位运算(和c艹一样) &:按位与 |:按位或 ^:异或(一样为0,不一样为1) ...

随机推荐

  1. 浅学git工具

    1.git工具介绍及使用 git工具直接安装: 直接运行exe文件进行安装,按默认的操作点击下一步就行了 校验: 在DOS命令行中输入:git  --version 如果能正常显示出对应的版本就是ok ...

  2. 开源不到 48 小时获 35k star 的推荐算法「GitHub 热点速览」

    本周的热点除了 GPT 各类衍生品之外,还多了一个被马斯克预告过.在愚人节开源出来的推特推荐算法,开源不到 2 天就有了 35k+ 的 star,有意思的是,除了推荐算法本身之外,阅读源码的工程师们甚 ...

  3. 一些随笔 No.1

    耦合 耦合是一个设计与逻辑上的问题 例如一个软件有20个功能,删除任意一个功能对别的19个功能不造成影响,就是低耦合 如果删除一个功能后其他功能会失去完整性,那么就是高耦合 Difference be ...

  4. 导致sql注入的根本原因

    导致sql注入的根本原因 1.sql注入的定义 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在 ...

  5. 线性规划的单纯形法—R实现

    table { margin: auto } 线性规划的单纯形法 线性规划是运筹学中的一个基本分支,它广泛应用现有的科学技术和数学方法,解决实际中的问题,帮助决策人员选择最优方针和决策,自1947年丹 ...

  6. 新旧版本功能对比 | v1.5.0 全新升级

    Hi~社区的小伙伴们大家好呀! CloudQuery 最新 1.5.0 社区版本即将于 4月14日 发布,正式上线前,我们迫不及待与大家分享与 v1.4 相比,v1.5.0 在性能和功能上有哪些更新和 ...

  7. Vue3中无法为el-tree-select设置反选问题分析

    好久没有写博客了,刚好上周遇到一个难缠问题,这里记录一下. 环境:Vue3.2.Element Plus 问题:子组件 setting.vue => 弹窗组件 Dialog => 树选择组 ...

  8. 太坑了吧!一次某某云上的redis读超时排查经历

    一次排查某某云上的redis读超时经历 性能排查,服务监控方面的知识往往涉及量广且比较零散,如何较为系统化的分析和解决问题,建立其对性能排查,性能优化的思路,我将在这个系列里给出我的答案. 问题背景 ...

  9. Map集合案例:统计输入多个key值出现的次数

    某商店想统计一下一天内所售出的商品以及商品的数量,请编写程序帮助实现,并展示.通过键盘录入商品名称模拟售出的商品, 录入一次表示商品售出一次,直到录入end结束.运行效果如下: 代码:

  10. 如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

    在上一篇文章(如何在 .NET Core WebApi 中处理 MultipartFormDataContent)中,我们有描述过如何以最简单的方式在 .NET Core WebApi 中处理 Mul ...