Typesetting math: 100%

[CSP-S模拟测试]:最大或(数学)


题目传送门(内部题141)


输入格式

  输入文件包含多组测试数据,第一行为一个正整数T,表示数据组数。
  接下来T行,每行两个正整数l,r。数据保证lr成立。


输出格式

  输出T行,每行一个正整数,为满足条件的x,y进行或运算后的最大值,即输出max(x or y)


样例

样例输入:

3
1 10
1023 1024
233 322

样例输出:

15
1023
511


数据范围与提示

  对于40%的数据,满足r500
  对于70%的数据,满足r106
  对于100%的数据,满足1lr1018,1T1,000


题解

首先,将lr都转化为二进制。

如果其在二进制下位数不一样,每一位都能是1,那么答案一定是1<<R1,其中Rr的二进制位数。

如果位数相等,从高往低第一个不一样的位往后都可以是1,而前面的是什么就只能是什么了。

时间复杂度:Θ(T×logr)

期望得分:100分。

实际得分:100分。


代码时刻

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
using namespace std;
long long L,R,ans;
int l[100],r[100],tl,tr;
void get()
{
    tl=tr=ans=0;
    while(L){l[++tl]=(L&1);L>>=1LL;}
    while(R){r[++tr]=(R&1);R>>=1LL;}
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld",&L,&R);get();
        if(tl==tr)
        {
            int res;
            for(int i=tl;i;i--){if(l[i]!=r[i])break;res=i;}
            ans=(1LL<<(res-1))-1;
            for(int i=res;i<=tl;i++)if(l[i])ans+=(1LL<<(i-1));
        }
        else ans=(1LL<<tr)-1;
        printf("%lld\n",ans);
    }
    return 0;
}

rp++

posted @   HEOI-动动  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
点击右上角即可分享
微信分享提示