trick : Trygub num

trick大意

我对于这个trick的理解为:支持位运算的高精度
维护一个以 b为基数的大数 N,并支持以下功能:

  • 给定(可能是负)整数 |x|,|y|n,将 xby加到 N
  • N0时,给定k,打印N的第k位数字(指以b为基底意义下的)。
  • 检查N是正值、负值还是等于0

操作 O(logn)均摊时间复杂度和 O(q)内存。并且只需要map进行实现,相比于线段树等数据结构维护非常的好写。

例题及实现 : [NOI2017] 整数

题意简述 : 一个整数x,进行n次操作,分为两种:

  • x 加上整数 a2b,其中 a 为一个整数,b 为一个非负整数

  • 询问 x 在用二进制表示时,位权为 2k 的位的值(即这一位上的 1 代表 2k

保证在任何时候,x0

  • 对于所有测试点,满足 |a|109
  • 对于所有测试点,满足 0b,k30n
  • 对于所有测试点,满足 n1000000

这里我们的基底为230,感性理解一下:把x的二进制表示分为若干段,每一段长是30位,这样每次我们只需要改动最多两段,分别对这两段将原数字位运算为相应位后直接加到数中,多于230的进行进位操作。

发现其实很像一个230进位制,这也是以b为基底的真正含义

关于均摊时间复杂度

其实我不是很能证明,但是再次感性理解,就是假设一些段内的数为[2301,2301,2301,2301...] 即对应二进制内全为1
显然加一次,他就会往后进很多位花大量时间,虽然这一次花了很多时间,但是呢,需要进位的次数其实是很少的,而不需要进位的时候,直接加又很快,这样下来我们的均摊时间就不是那么慢了。

代码

先咕,急的看参考资料。

习题

参考资料

如果英语还不错,可以直接看原CF博客:
Big integers with negative digits: The Trygub numbers

CF原作者的[NOI2017] 整数提交记录

__EOF__

  • 本文作者: six-one
  • 本文链接: https://www.cnblogs.com/six-one/p/17608886.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • © 版权声明
    THE END
    喜欢就支持一下吧
    点赞0

    Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY7vkYfq' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
    admin的头像-五八三
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    图形验证码
    取消
    昵称代码图片