一题水两篇怎么说。

上一篇中我们采用智慧方法减少了比较次数,避免了使用复杂的高精度数。现在我们有高论!可以做到 \(\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. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试

    1.简介 Charles最大的优势在于抓包分析,而且我们大部分使用的功能也在抓包的功能上,但是不要忘记了,Charles也可以做接口测试.至于Mock,其实在修改请求和响应数据哪里就已经介绍了,宏哥就 ...

  2. 迁移学习(DCCL)《Domain Confused Contrastive Learning for Unsupervised Domain Adaptation》

    论文信息 论文标题:Domain Confused Contrastive Learning for Unsupervised Domain Adaptation论文作者:Quanyu Long, T ...

  3. 【CTF】系统调用号查询表

    32位 #ifndef _ASM_X86_UNISTD_32_H #define _ASM_X86_UNISTD_32_H 1 #define __NR_restart_syscall 0 #defi ...

  4. 逍遥自在学C语言 位运算符 "|" 的5种高级用法

    前言 在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是 ...

  5. Go语言实现协程下载器

    一般常用的下载方式是通过浏览器访问URL,然后基于HTTP进行下载.这种单线程下载方式通常比较慢,这里尝试使用Go语言实现一个多协程的下载器. 大致思路 按照传统的单线程的思路,实现下载要基于HTTP ...

  6. [OpenCV-Python] 20 图像金字塔

    文章目录 OpenCV-Python:IV OpenCV中的图像处理 20 图像金字塔 20.1 原理 20.2 使用金字塔进行图像融合 OpenCV-Python:IV OpenCV中的图像处理 2 ...

  7. C++ Primer 5th 阅读笔记:入门指南

    学习方法 The way to learn a new programming language is to write programs. 学习一门新编程语言的方式是编写程序. 函数(Functio ...

  8. 「学习笔记」AC 自动机

    「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前 ...

  9. OpenResty学习笔记03:再探WAF

    一. 再谈WAF 我们上一篇安装的WAF来自另一位技术大神 赵舜东,花名 赵班长,一直从事自动化运维方面的架构设计工作.阿里云MVP.华为云MVP.中国SaltStack用户组发起人 .新运维社区发起 ...

  10. 2020-09-07:Docker的四种网络类型?

    福哥答案2020-09-07: 敲docker network ps命令,显示三种模式.1.bridge模式:使用–net =bridge指定,默认设置.桥接式网络模式(默认).容器的默认网络模式,d ...