简要题意

给定一个区间 \([l,r]\),从中选出若干整数按位或,求可能出现的数的方案数。

数据范围:\(1\le l\le r\le2^{60}\)。

思路

首先对于 \([l,r]\) 里的数全都满足条件,然后因为是按位或,所以 \(l,r\) 二进制下的一段前缀就与答案无关可以先去掉。

现在我们只需要考虑比 \(r\) 还要大的数。去掉一段前缀后 \(r\) 二进制的最高位一定是 \(1\),设 \(x=highbit(r)\),我们可以根据 \(x\) 将这个区间划分成两部分 \([l,x)\) 和 \([x,r]\)。对于第一个区间里,任何数按位或答案都在第一个区间内,所以不用考虑,我们只用考虑只在第二个区间选数或者两个区间都选数。你会发现在第一个区间选多少数都可以等价为选一个数,所以其实只用考虑选两个数的情况。

  1. 如果只在第二个区间选数,我们可以不看最高位的一,因为他是公共部分。假设剩下的部分为 \(y\),那么在第二个区间选数就等价于在 \([0,y]\) 内选数,设 \(z=highbit(y)\),实际上选出来的就是 \([x,x+2z)\) 的所有数,去掉小于等于 \(r\) 的答案区间就为 \((r,x+2z)\);
  2. 如果在两个区间中各选一个数,我们可以发现对于第一个区间我们可以选 \([l,x)\),当第二个区间选 \(x\) 的时候就可以凑出 \([x+l,2x)\) 中的所有数,答案区间就为 \([\max(x+l,r+1),2x)\)。

最后只需要判断一下后两种情况是否有交集,如果有交集那么最后答案就直接为 \([l,2x)\),否则就把答案区间累加即可。时间复杂度只有 \(O(\log r)\),非常优秀!

代码

signed main(){
// fileio(fil);
l = rd(), r = rd();
if(l == r)return puts("1"), 0;
for(int i = 60; ~ i; --i){
x |= r >> i << i;
if((l >> i) ^ (r >> i))break;
}
y = x & - x; r += y - x;
l += y - x; ans = r - l + 1;
for(x = 1; x + y <= r; x <<= 1); x += y - 1;
if((y | l) <= x)return printf("%lld", (y << 1) - l), 0;
ans += (y << 1) - (y | l) + x - r;
printf("%lld", ans);
return 0;
}

AGC015D题解的更多相关文章

  1. AtCoder随做

    突然发现只有我没写过 AT. 没写题解不意味着没做,有的忘了写或者太草率了就算了. 部分前言删了. 目录 ABC020D ABC241G ABC268 AGC003D AGC004D AGC004E ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  10. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 腾讯云 COS 多 AZ 存储保证服务高可用性

    腾讯云 COS 的多 AZ 存储架构能够为用户数据提供数据中心级别的容灾能力.多 AZ 存储将客户数据分散存储在城市中多个不同的数据中心,当某个数据中心因为自然灾害.断电等极端情况导致整体故障时,多 ...

  2. vue3笔记 - 父子组件通信

    父传子 说明:父组件将数据绑定在组件标签上:子组件props接收 父组件: <template> <Child :msg="msg" /> </tem ...

  3. .NET 单文件执行程序拆解器 SingleFileExtractor

    .NET 单文件执行程序拆解器 SingleFileExtractor .NET 现在支持将程序打包为单文件格式,这方便了部署,问题是,我们不能直接看到程序中使用了哪些 DLL,更不能简单地通过查看文 ...

  4. Python 和 Podman

    1. Windows 10 上安装 Python 开始在 Windows 上使用 Python(初学者) 2. 使用 pip Python 的 Microsoft Store 安装包括 pip(标准包 ...

  5. Podman与docker兼容性问题

    使用Podman最好的地方就是支持rootless,也就是说用户不需要为root权限即可进行容器的管理操作.因此现在在CentOS 8及以后的版本中,默认使用Podman替代Docker,如果使用do ...

  6. 【JavaWeb】【Cookie】通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆

    通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆 Cookie类的构造方法 public Cookie(java.lang.String name,java.lang.String ) 1 ...

  7. [转]vue-router动态添加路由的方法,addRouter添加路由,提示:Duplicate named routes definition

    问题描述:在做使用vue-router动态添加路由的方法,addRouter添加,使用 console.log(this.$router.options.routes) 打印对象,发现添加成功,但是一 ...

  8. vue-cli@4搭建 vue + element-ui 项目实操

    原文链接: vue-cli@4搭建 vue + element-ui 项目实操

  9. 一套分布式IM即时通讯系统的技术选型和架构设计

    本文由冰河分享,作者博客 binghe.gitcode.host,原题"这套分布式IM即时通讯系统如何写到简历上?我给你整理好了!",本文有修订和改动. 1.引言 分布式IM即时通 ...

  10. 《深入理解Mybatis原理》MyBatis的sqlSession执行流程

    sqlSessionFactory 与 SqlSession 正如其名,Sqlsession对应着一次数据库会话.由于数据库会话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在 ...