题目链接:点我

题意:

给你一个区间[a,b],让你从里面选一个连续子区间[x,y](子区间可以为[a,b]),把这个区间的所有数或起来x|x+1|x+2|...|y

你要使得区间[x,y]异或起来的结果要小于等于v。让你输出这个子区间的最大长度

题解:

我们可以先不考虑题目这个问题,换一个简单的问题:

对于任意一个数num,找到一个最大的x,x≤num,使其x|(x+1)|(x+2)|…|num>num

结论:

如果存在这样一个数x,那么num的二进制表示中的最低位的一个0,求这个0如果变成1会增加权值ans,然后x=num-ans

例如num二进制为:110101,那么x=110011

这个时候x|x+1|x+2|...|num刚好大于num,如果从x+1|x+2|...num就不会大于num(可以试试

那么可以说对于可选区间[x,y],如果把y=num,那么可选区间最长长度就是num-x

那么简化的问题就解决了,对于题目也就相当于可选区间[x,y]的右边界y不一定等于v,那么我们就可以枚举所有小于v的值,然后从中取最大区间就可以了

因为我们解决问题的时候求的x是num减去num的最低位二进制表示最低位0的权值,那么对于区间[x,y]右边界y的选取可以枚举0的位置就可以了

我们可以使用lowbit(~a)方式求num的最低位二进制表示最低位0的权值

因为~a就是把a按照二进制形式每一位取反,这样的话每一位的0变成了1,1变成了0

然后使用lowbit(b)方法求出来b的二进制下最低位1的权值

x&(-x),当x为0时结果为0;x为奇数时,结果为1;x为偶数时,结果为x中2的最大次方的因子。

而且这个有一个专门的称呼,叫做lowbit,即取2^k。

代码:

#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <vector>
#include <bitset>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int readint()
{
int tmp = 0, fh = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-') fh = -1;
c = getchar();
}
while (c >= '0' && c <= '9') tmp = tmp * 10 + c - 48, c = getchar();
return tmp * fh;
}
inline long long readll()
{
long long tmp = 0, fh = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-') fh = -1;
c = getchar();
}
while (c >= '0' && c <= '9') tmp = tmp * 10 + c - 48, c = getchar();
return tmp * fh;
}
ull lowbit(ull x) //求一个数二进制中的最低位1的数值
{
return -x & x;
}
ll min(ll a,ll b)
{
if(a<b) return a;
else return b;
}
ll max(ll a,ll b)
{
if(a>b) return a;
else return b;
}
int main()
{
//printf("%lld\n",1ll<<62);
int t;
scanf("%d",&t);
while(t--)
{
ll a,b,v,len1=0,len2=0;
scanf("%lld%lld%lld",&a,&b,&v);
for(int i=0;i<=62;++i) //1左移62位都1e19呢
{
if((1ll<<i)&b)
len1=i;
if((1ll<<i)&v)
len2=i;
}
if(len2>len1)
{
printf("%lld\n",b-a+1);
continue;
}
if(v<a)
{
printf("0\n");
continue;
}
ll ans=0;
ull res=v;
while(1)
{
ull l; //因为我们要求出来res的最低二进制位0的权值,所以需要取反
ull tmp=lowbit(~res);
if(res>=tmp)
{
l=res-tmp;
}
else l=a-1;
ans=max(ans,min(res,b)-max(l,a-1));
printf("%lld***\n",ans);
res=l;
if(a>res) break;
}
printf("%lld\n",ans);
}
return 0;
}

CF-gym/101810 J、T-Shirts Dilemma的更多相关文章

  1. gym 101810 M. Greedy Pirate (LCA)

    题目:https://codeforc.es/gym/101810/problem/M 题意:给 你一颗树,下面有m次查询,求u->v的最大值是多少,输入两点之间都会有两条边,正边有正权,反边有 ...

  2. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  3. Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】

     2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...

  4. 【codeforces.com/gym/100240 J】

    http://codeforces.com/gym/100240 J [分析] 这题我搞了好久才搞出样例的11.76....[期望没学好 然后好不容易弄成分数形式.然后我‘+’没打..[于是爆0... ...

  5. CF Gym 102028G Shortest Paths on Random Forests

    CF Gym 102028G Shortest Paths on Random Forests 抄题解×1 蒯板子真jir舒服. 构造生成函数,\(F(n)\)表示\(n\)个点的森林数量(本题都用E ...

  6. codeforces Gym 100187J J. Deck Shuffling dfs

    J. Deck Shuffling Time Limit: 2   Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...

  7. codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

    题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...

  8. codeforces Gym 100500 J. Bye Bye Russia

    Problem J. Bye Bye RussiaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1005 ...

  9. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

随机推荐

  1. 浅谈TypeScript,配置文件以及数据类型

    TypeScript在javaScript基础上多了一些拓展特性,多出来的是一些类型系统以及对ES6新特性的支持最终会编译成原始的javaScript, 文件名以.ts结尾,编译过后.js结尾,在an ...

  2. Linux 用户操作之用户管理 (用户增删改操作)

    目录 添加用户 删除用户 修改用户 切换用户 配置用户密码 查看配置文件 cat /etc/pwsswd 添加用户 可选项 -c comment 指定一段注释性描述. -d 目录 指定用户主目录,如果 ...

  3. tomcat控制台运行窗口中文乱码

    启动tomcat时出来的运行窗口中文乱码, 如图所示:看得有点不舒服 解决方法:找到Tomcat安装路径下的 /conf/logging.properties 文件 文件末尾添加语句: java.ut ...

  4. 【Linux】服务器识别ntfs移动磁盘方法

    Linux服务器无法识别ntfs磁盘 如果想识别的话,需要安装一个包ntfs-3g 安装好后,将移动磁盘插入到服务器的usb口中 新建一个目录,将磁盘挂载在新建的目录上 挂载命令如下: mount - ...

  5. missing tables and indexes的处理办法

    最近做了SAP系统的异构迁移,顺便把oracle DB也升级了,从10g升级到11g,但是升级后,在DB02或者是ora_space中的diagnostics->Missing Tables a ...

  6. APM调用链产品对比

    APM调用链产品对比 随着企业经营规模的扩大,以及对内快速诊断效率和对外SLA(服务品质协议,service-level agreement)的追求,对于业务系统的掌控度的要求越来越高,主要体现在: ...

  7. centos7 开放指定端口

    centos7 开放指定端口 #开放8080端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent #重载防火墙 firewall- ...

  8. 鸿蒙的多媒体及Menu组件及小程序的多媒体组件

    目录: js业务逻辑层 视图渲染层 css属性设置 效果图 微信小程序展示 内网穿透工具下载 我们在搭建一个小程序或者网站的时候,往往要加载很多的图片,音频和视频文件.如果都从服务器获取静态资源,这样 ...

  9. Ubuntu14.04系统安装

    1. 使用U盘或光盘进行引导进入系统安装向导. 2. 安装类型选择,选择中文(简体).然后点安装ubuntu. 3. 安装ubuntu电脑必须接入外网(外网的方式有自动获取或手动编辑IP地址). 网络 ...

  10. 手把手做一个基于vue-cli的组件库(下篇)

    基于vue-cli4的ui组件库,上篇:如何做一个初步的组件.下篇:编写说明文档及页面优化.接上篇,开工. GitHub源码地址:https://github.com/sq-github/sq-ui ...