收藏夹重新回顾

简介: 收藏夹重新回顾

分享一道收藏的好题

我收藏的这道题是一道红题,来自洛谷 P2623,题目名为「计数」。这道题的难度大概在紫到黑的样子,我当初收藏它是因为它是一道奇怪的计数题,有点格雷码的感觉。这道题给定两个整数 ab,问有多少个 x[a,b],满足x(x+1)[a,b],其中 表示按位异或操作。

一开始看到这道题,我一脸懵逼。因为我稍微做过一些计数题,但是好像从没见过按位异或的题。于是我开始思考如何解决这道题。我尝试画图,分析一些规律,但是一直都没能得到正确的答案。

后来我在网上查找资料,看到了一篇题解,介绍了一种非常巧妙的做法。这个做法基于一个性质:如果两个数按位异或后得到的二进制表示中,某一位为 1,则这两个数在这一位上的二进制位一个为 0 一个为 1。这样我们可以对于每一位来统计答案。

具体地,我们可以考虑从高位到低位,类似于二分的操作,不断将区间一分为二。具体地,我们假设当前二进制位为第k 位,我们设Lab 按照当前位所对应的二进制为止的数,而R 则是 L+1。例如,如果当前位是第 3 位,a 的二进制表示为 101110,b 的二进制表示为 100011,则L 为 101000,而R 则为 101001。这样,我们就把区间一分为二。

接下来,我们考虑 x[L,R1] 的情况,这样对于 x+1,它肯定是在[L+1,R] 中。于是我们可以递归地计算[L,R1][L+1,R] 中满足条件的x 的个数,然后把两个区间的答案加起来即可。

当然,在具体的计算中,我们还需要考虑一些特殊情况,例如当L=0x 就不能取 0,而当 L=R1 时,我们就不需要递归地计算,直接返回答案即可。

总体而言,这道题的计数方法非常巧妙,值得好好思考和学习。


相关文章
|
7月前
|
前端开发
首页变灰 实现
首页变灰 实现
首页变灰 实现
|
SQL XML 算法
揭秘!我收藏夹里的常用网站
揭秘!我收藏夹里的常用网站
228 0
|
前端开发 安全 开发者
新闻-标签页|学习笔记
快速学习 新闻-标签页
|
人工智能 前端开发 JavaScript
从2021的收藏夹里掏出 22个实用的前端工具给大家~(上)
大家好,我是零一,转眼又到了2022年,相信大家去年收藏夹里一定多了不少宝藏工具,快一起来分享一下吧~ 我先来!
166 0
从2021的收藏夹里掏出 22个实用的前端工具给大家~(上)
|
数据可视化
分享我的收藏夹里面的这些神器(二)
下面来第二期,这一期会介绍三个比较好用的工具。
472 0
|
数据采集 人工智能 自然语言处理
分享我的收藏夹里面的这些神器(一)
趁手的工具有时候能够帮助我们节省很多时间和精力,下面就给大家介绍一下我收藏夹里面的神器吧。
419 0
|
Web App开发 JavaScript