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) ...
随机推荐
- 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试
1.简介 Charles最大的优势在于抓包分析,而且我们大部分使用的功能也在抓包的功能上,但是不要忘记了,Charles也可以做接口测试.至于Mock,其实在修改请求和响应数据哪里就已经介绍了,宏哥就 ...
- 迁移学习(DCCL)《Domain Confused Contrastive Learning for Unsupervised Domain Adaptation》
论文信息 论文标题:Domain Confused Contrastive Learning for Unsupervised Domain Adaptation论文作者:Quanyu Long, T ...
- 【CTF】系统调用号查询表
32位 #ifndef _ASM_X86_UNISTD_32_H #define _ASM_X86_UNISTD_32_H 1 #define __NR_restart_syscall 0 #defi ...
- 逍遥自在学C语言 位运算符 "|" 的5种高级用法
前言 在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是 ...
- Go语言实现协程下载器
一般常用的下载方式是通过浏览器访问URL,然后基于HTTP进行下载.这种单线程下载方式通常比较慢,这里尝试使用Go语言实现一个多协程的下载器. 大致思路 按照传统的单线程的思路,实现下载要基于HTTP ...
- [OpenCV-Python] 20 图像金字塔
文章目录 OpenCV-Python:IV OpenCV中的图像处理 20 图像金字塔 20.1 原理 20.2 使用金字塔进行图像融合 OpenCV-Python:IV OpenCV中的图像处理 2 ...
- C++ Primer 5th 阅读笔记:入门指南
学习方法 The way to learn a new programming language is to write programs. 学习一门新编程语言的方式是编写程序. 函数(Functio ...
- 「学习笔记」AC 自动机
「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前 ...
- OpenResty学习笔记03:再探WAF
一. 再谈WAF 我们上一篇安装的WAF来自另一位技术大神 赵舜东,花名 赵班长,一直从事自动化运维方面的架构设计工作.阿里云MVP.华为云MVP.中国SaltStack用户组发起人 .新运维社区发起 ...
- 2020-09-07:Docker的四种网络类型?
福哥答案2020-09-07: 敲docker network ps命令,显示三种模式.1.bridge模式:使用–net =bridge指定,默认设置.桥接式网络模式(默认).容器的默认网络模式,d ...