题解 SP25844【MAXXOR - Find the max XOR value】
以下用 \(\oplus\) 表示异或运算。
先说结论:设 \(x=L\oplus R\),则答案为最小的 \(2^k-1\) 使得 \(2^k-1\ge x\) 即 \(2^k > x\)。
(一)答案不可能超过 \(2^k-1\)。
为了让异或后最高位尽量高,我们先取一个最高位最高的数,也就是 \(R\),然后再取一个数使得该位尽量为 \(0\)。
如果 \(L\) 的该位为 \(0\),符合条件,此时答案最高位与 \(x\) 都相同,而 \(2^k-1\) 是最高位相同的最大的数,所以答案一定不超过 \(2^k-1\)。如果 \(L\) 的该位为 \(1\),则该位异或出来为 \(0\),不考虑这一位,去找后面的位也是同理。极端情况是 \(L=R\),此时 \(x=0\),\(2^k-1=0\) 也是没有问题的。
(二)答案可以取到 \(2^k-1\)。
我们称在二进制下表示 \(0\) 或 \(2^i\) 的数位为“第 \(i\) 位”。
因为 \(x=L\oplus R\) 在第 \(k-1\) 位为 \(1\),说明 \(L\sim R\) 之间有一个位置的第 \(k-1\) 位发生了变化。而 \(L\sim R\) 是连续变化的,每次加一,也就是说必然有一个位置从 \(\underbrace{11\cdots 1}_{k-1\ \text{个}}\) 变成了 \(1\underbrace{00\cdots 0}_{k-1\ \text{个}}\),显然这两个数的异或为 \(2^k-1\)。
综上,结论正确。
//By: Luogu@rui_er(122461)
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
#define debug printf("Running %s on line %d...\n",__FUNCTION__,__LINE__)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;
template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}
int main() {
int L, R;
scanf("%d%d", &L, &R);
R ^= L;
for(int i=0;;i++) {
if((1 << i) > R) {
printf("%d\n", (1 << i) - 1);
break;
}
}
return 0;
}
顺带一提,因为数据水,第 \(18\) 行的大于号打成大于等于也可以通过,但显然不对,例如 \(L=2,R=3\)。
本文来自博客园,作者:rui_er,转载请与作者联系并注明原文链接:https://www.cnblogs.com/ruierqwq/p/sp-25844.html
原文地址:https://www.cnblogs.com/ruierqwq/p/sp-25844.html
- Leetcode-Easy 141. Linked List Cycle
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
- 51nod1004 n^n的末位数字
- Leetcode-Easy 20. Valid Parentheses
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- Javascript之创建对象
- Leetcode-Easy 136. Single Number
- 2017.10.25水题大作战题解
- Angular开发实践(四):组件之间的交互
- Leetcode-Easy 70. Climbing Stairs
- Angular开发实践(八): 使用ng-content进行组件内容投射
- Angular开发实践(六):服务端渲染
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter实现用视频背景的登录页的示例代码
- Flutter实现可循环轮播图效果
- Android判断登录情况
- linux尝试登录失败后锁定用户账户的两种方法
- Linux内存泄漏检测shell脚本
- 详解Linux系统中网卡MAC地址克隆方法
- linux下日志定时轮询的流程详解
- Vim中查找替换及正则表达式的使用详解
- CentOS 7下部署php7.1和开启MySQL扩展的方法教程
- Ubuntu系统下用Crontab命令定时执行PHP文件详解
- CentOS7 LNMP+phpmyadmin环境搭建 第三篇phpmyadmin安装
- Linux有限状态机FSM的理解与实现
- Linux下浅谈crond与crontab的命令用法
- centos 7系统下安装Jenkins的步骤详解
- linux tomcat配置https的方法