首页 > 其他分享 >Trygub Number

Trygub Number

时间:2024-02-07 16:36:01浏览次数:28  
标签:map log Trygub 复杂度 Number 查询 mathcal 进位

参考资料

做 「NOI2017」整数 的时候了解到有这个东西,支持对于 \(B\) 进制数 \(X\):

  • 加上 \(x\cdot B^y\),复杂度为 \(\mathcal{O}(\log V+\log n)\)。
  • 查询第 \(k\) 位的值,复杂度为 \(\mathcal{O}(\log V+\log n)\)。

复杂度是瞎写的,反正就是一个 \(\log\)。

具体思路是维护一个序列 \(a\),其中 \(a_i\in(-B,B)\),\(X=\sum_{i\geq 0} a_iB^i\),每次加的时候暴力进位。为了方便查询,我们用 map 维护所有非 \(0\) 位置,然后在查询的时候 lower_bound 一下看有没有进位即可。

先说明进位次数是正确的。假设 \(X\) 为当前位的值,它贡献到下一位的值为 \(X/B\)。分两部分考虑进位:

  • \(X\geq 2B\),显然它会在 \(\log V\) 轮之后变成下一种情况。
  • \(X<2B\),此时它对下一位的贡献为 \(1\)。定义势能函数为“临界位置”的值,即 \(|a_i|=B-1\) 的位置个数。在这种情况下,一次进位至少消耗一个临界位置。而一次操作至多增加一个临界位置,所以均摊正确。

由于查询需要利用 map 维护值,所以此时的复杂度是 \(\mathcal{O}(\log V\log n)\),还能再优化吗?

注意到我们修改的 map 的迭代器是连续的,你可以用 loj 上的一个帖子类似的技巧做到均摊常数访问一段连续的迭代器。所以复杂度降到了一个 \(\log\)。

\(\mathcal{O}(\log V\log n)\) 代码

\(\mathcal{O}(\log V+\log n)\) 代码

当然可以用压位做到更快,但相信没有无良出题人卡这个算法。

标签:map,log,Trygub,复杂度,Number,查询,mathcal,进位
From: https://www.cnblogs.com/yllcm/p/18011028

相关文章

  • 特征识别码(File Identifier) 文件索引号(File Index Number,FID)
    在Windows系统中,每个文件和文件夹都有一个唯一的标识符,称为特征识别码(FileIdentifier)。特征识别码是用于标识文件系统中文件或文件夹的一种机制,通常是一个整数值。不同的文件系统和操作系统可能会采用不同的方式生成特征识别码。在Windows文件系统中,每个文件或文件夹都有一......
  • P9309 [EGOI2021] Number of Zeros题解
    模拟赛时以为是进位制的题目,结果还做出来了。此题解解法与其它相似,但观察的角度不同(作者的脑回路不同)。此题问\(a\simb\)的最小公倍数中后导\(0\)的个数,即求其中\(2\)和\(5\)个数的最小值。分别计算即可,想到进位制,以\(a=10\),\(b=12\)时\(2\)的个数为例:1001(9)......
  • CF1687D Cute number 题解
    题目链接点击打开链接题目解法一个数\(c\)是可爱(下文称为合法)的,当且仅当\(c\in[x^2,x(x+1)]\)令\(a_i\)属于\([x_i,x_i(x_i+1)]\)一个显然的范围是\(x_1\le2\times10^6\)考虑枚举\(x_1\)现在说明一个结论:\(x_1\)固定时,\(x_i\)也固定了说明:不难发现,合法的不合......
  • Redis - ERR wrong number of arguments for 'hset' command
    这个错误提示通常是因为执行HSET命令时参数数量不正确导致,HSET只能设置一组key/value,设置多组则使用HMSET。HSET命令需要指定三个参数:Hash键、Hash字段和字段值。如果参数数量不正确,Redis服务器将返回"ERRwrongnumberofargumentsfor‘hset’command"错误提示。常见的可......
  • 无涯教程-Number.parseFloat()函数
    此方法解析字符串参数,并返回传递的字符串的浮点表示形式。Number.parseFloat()-语法Number.parseFloat(string)string  - 要解析的值Number.parseFloat()-返回值字符串的浮点表示形式。Number.parseFloat()-示例console.log(Number.parseFloat("10"));conso......
  • 无涯教程-Number.isFinite()函数
    Number.isFinite()方法确定传递的值是否为有限数字。Number.isFinite()-语法varres=Number.isFinite(value);Number.isFinite()-返回值返回布尔值true或false。Number.isFinite()-示例varres=Number.isFinite(10);console.log(res);运行上面代码输出true参......
  • 无涯教程-Number.NEGATIVE_INFINITY函数
    这是一个特殊的数值,表示小于Number.MIN_VALUE的值。该值表示为"-Infinity"。如,任何乘以NEGATIVE_INFINITY的值为NEGATIVE_INFINITY,而除以NEGATIVE_INFINITY的值为零。因为NEGATIVE_INFINITY是一个常数,所以它是Number的只读属性。Number.NEGATIVE_INFINITY-语法varval=Numbe......
  • 无涯教程-Number.Nan函数
    不带引号的文字常量NaN是表示非数字的特殊值。由于NaN总是比较不等于任何数字(包括NaN),因此它通常用于返回有效数字的函数的错误情况。Number.Nan-语法varval=Number.NaN;Number.Nan-示例vardayOfMonth=50;if(dayOfMonth<1||dayOfMonth>31){dayOfMonth......
  • CF282D Yet Another Number Game
    题意简述有\(n\)堆石子,第\(i\)堆包含\(a_i\)个,每次可以选择任意一堆取出任意数量石子,也可以选择对于所有石子堆都拿走任意数量化石子。问先手必胜还是后手必胜。\(n\le3,a_i\le300\)。解法一:动态规划发现\(a_i^3=2.7\times10^7\),完全能压到状态里,直接做dp即可。但......
  • 无涯教程-Number.MAX_VALUE函数
    Number.MAX_VALUE属性属于静态Number对象,它代表JavaScript可以使用的最大可能正数的常量。该常数的实际值为1.7976931348623157x10308Number.MAX_VALUE-语法varval=Number.MAX_VALUENumber.MAX_VALUE-示例varval=Number.MAX_VALUE;console.log("ValueofNumber.......