agc015D A or...or B Problem
2024-09-06 13:22:37
题意:求用若干个(至少一个)[A,B]中的数进行or操作能得到多少本质不同的数
$1 \leq A \leq B < 2^{60}$
一直在想数位dp,看了题解之后感觉自己就是个sb
我们先把$A,B$前面(高位)相同的二进制位忽略掉,反正无论怎么或都是一样的
那么我们找到一个最大的$p$使得$A>>p \& 1 \ne B>>p \& 1$
下面的$A,B$都是把$p+1$位之后忽略掉(看作0)之后的。
令$T=1<<p$,我们把$[A,B]$看作两部分,$X=[A,T)$和$Y=[T,B]$
我们可以分为三种情况:
1、只选$X$里面的数,最后或出来的数的范围是$[A,T)$
2、只选$Y$里面的数。
令$k$是$B$里面最高位的1的位置(除了$p$这一位)
最后或出来的数的范围就是$[T,T+(1<<k+1)-1]$
3、两个集合里面的数都要选,最后或出来的数的范围是$[T+A,2*T-1]$,就是选$T$和一个$X$里面的数
注意第二种情况和第三种情况有重叠部分。
我怎么把题解翻译了一遍……
这么低的复杂度也让我有点惊讶呢
这种题特点在于,集合里面数是连续的,然后或起来也就是几段连续的。
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define lc son[pos][0]
#define rc son[pos][1]
const int W=60;
ll n,m,ans; char cc;ll ff;
template<typename T>void read(T& aa) {
aa=0;ff=1; cc=getchar();
while(cc!='-'&&(cc<'0'||cc>'9')) cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} int lb(ll x) {int rs=0;while(x) rs++,x>>=1;return rs;} int main() {
read(n); read(m);
ll p=W,x;
while(p>=0&&((n>>p)&1)==((m>>p)&1)) p--;
if(p>=0) {
n&=(1LL<<p+1)-1;
m&=(1LL<<p)-1;
ans+=(1LL<<p)-n;
x=lb(m);
ans+=(1LL<<x);
n=max(n,1LL<<x);
ans+=(1LL<<p)-n;
}
else ans=1;
printf("%lld\n",ans);
return 0;
}
最新文章
- Project &#39;king.commons&#39; is missing required library: &#39;lib/plweb.jar&#39;		Build path	Build Path Problem
- 某墙尼妹,用个Response.Filter来解决StackExchange.Exceptional中google cdn的问题
- ionic cordova 热更新的一些问题
- IE、FF、Safari、OP不同浏览器兼容报告
- struts2 using kindeditor upload pictures (including jmagic compressed images)
- 重学STM32---(五)ADC
- POJ 3522 Slim Span 最小差值生成树
- java 小结2 多态问题和容器介绍
- DoctorNote医生处方笔记开发记录
- Wall(Graham算法)
- 导入jsp
- Linux下内存问题检测神器:Valgrind
- 安卓TV开发(五) 移动智能终端UI之实现主流TV焦点可控UI
- Proj.Net 投影介绍
- cpu_relax
- java aes CBC的填充方式发现
- [Swift]LeetCode306. 累加数 | Additive Number
- Python全栈开发之---mysql数据库
- .net core2.x - 关于仓储(Repository)
- KeepAlive安装指南
热门文章
- ArduinoUno和Leonardo的区别
- Ubuntu安装Maven(转)
- python的命名规范
- StringBuffer清空
- Python学习day34-面向对象和网络编程总结
- <;数据库>;MySQL的安装及安装中存在的问题
- 解决Couldn&#39;t resolve host &#39;mirrorlist.centos.org
- vue:解决使用param传参后,再次刷新页面会新增一个原有的tab
- mysql备份时的快照原理
- MySQL系列(十一)--外键约束foreign key的基本使用