D. Little Girl and Maximum XOR(贪心)

D. Little Girl and Maximum XOR

A little girl loves problems on bitwise operations very much. Here‘s one of them.

You are given two integers
l and r. Let‘s consider the values of
for all pairs of integers
a and b
(l?≤?a?≤?b?≤?r). Your task is to find the maximum value among all considered ones.

Expression means applying bitwise excluding or operation to integers
x and y. The given operation exists in all modern programming languages, for example, in languages
C++ and Java it is represented as "^", in
Pascal — as ?xor?.

Input

The single line contains space-separated integers
l and r (1?≤?l?≤?r?≤?1018).

Please, do not use the
%lld specifier to read or write 64-bit integers in С++. It is preferred to use the
cin, cout streams or the
%I64d specifier.

Output

In a single line print a single integer — the maximum value of
for all pairs of integers
a, b
(l?≤?a?≤?b?≤?r).

Sample test(s)

Input

1 2

Output

3

Input

8 16

Output

31

Input

1 1

Output

0

题意: 在区间[l,r]中找出两个数a,b(a <= b),使得a ^ b达到最大;

题解:(1) 首先有这样一个现象,当2 ^ n <= r的n达到最大时,且2 ^ n - 1 >= l ,答案是(2 ^ n + 2 ^ n - 1),即其二进制数全部为一,且为异或的最大值,没法再大,因为2 ^ n已达到
极限; 另一种情况是当2^n < l 时就贪心处理. 从高位往低位枚举,对于当前为如果二进制数为1,比l还小的话,则置为1,如果当前值大于r的话,则置为0; 否则则后面的位符合
(1)说法;

AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <bitset>
#include <algorithm>
#include <vector>

#define lson l,mid,u << 1
#define rson mid + 1,r,u << 1 | 1
#define ls u << 1
#define rs u << 1 | 1
#define exp 1e-8

using namespace std;
typedef long long ll;

int main() {
    ll l,r;
    while(cin>>l>>r) {
        ll maxn = 0;
        if(l == r) {
            puts("0");
            continue;
        }
        ll i = 0,ans;
        while(true) {
            ans = 1LL << i;
            if(ans > r) {
                ans = 1LL << (i - 1);
                break;
            }
            i++;
        }
        i--;
        if(ans >= l && ans - 1 >= l) {
            cout<<ans + ans - 1<<endl;
        } else {
            while(true) {
                ll res = ans + (1LL << (i - 1));
                if(res <= l) ans += 1LL << (i - 1);
                else if(res <= r){
                    ans = 0;
                    for(ll j = 0; j < i; j++) {
                        ans += 1LL << j;
                    }
                    break;
                }
                i--;
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

时间: 2024-08-05 05:34:20

D. Little Girl and Maximum XOR(贪心)的相关文章

CF169D2 D – Little Girl and Maximum XOR 贪心

解题思路: 经过打表可得规律答案要么是0 要么是2的N次 要得到最大的XOR值,其值一定是2的N次 即在 l 和 r 的二进制中,从左到右遍历过去,如果碰到 l 为 1 r 为 0 则可说明在『l , r]中存在 1000000000 和 0111111111 可得到最大XOR值为2的N次 PS:不会存在首先出现 l 为 0 r 为 1 的情况,因为 l < r #include<stdio.h> #include<math.h> int main(){ long long

CodeForces 276D – Little Girl and Maximum XOR 贪心

整整10个月后第二次搞这个问题才搞懂........第一次还是太随意了. 解题思路: 经过打表可得规律答案要么是0 要么是2的N次 - 1 要得到最大的XOR值,其值一定是2的N次 - 1 即在 l 和 r 的二进制中,从左到右遍历过去,如果碰到 (2 ^ i) & l 为 1 , (2 ^ i) & r 为 0 即在 l 和 r 之间一定存在 形如 10+ 和01+这样的数. 则可说明在[l , r]中存在 1000000000 和 0111111111 可得到最大XOR值为2的N次 -

CQUOJ 9906 Little Girl and Maximum XOR

Little Girl and Maximum XOR Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 276D64-bit integer IO format: %I64d      Java class name: Any A little girl loves problems on bitwise operations very much.

Maximum Xor Secondary(单调栈好题)

Maximum Xor Secondary CodeForces - 280B Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1,?x2,?...,?xk (k?>?1) is such maximum element xj, that the following inequalit

hdu-5661 Claris and XOR(贪心)

题目链接: Claris and XOR Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description Claris loves bitwise operations very much, especially XOR, because it has many beautiful features. He gets four positive int

421. Maximum XOR of Two Numbers in an Array

Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum result of ai XOR aj, where 0 ≤ i, j < n. Could you do this in O(n) runtime? Example: Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum resul

[LeetCode] 421. Maximum XOR of Two Numbers in an Array(位操作)

传送门 Description Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum result of ai XOR aj, where 0 ≤ i, j < n. Could you do this in O(n) runtime? Example: Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: T

LeetCode Maximum XOR of Two Numbers in an Array

原题链接在这里:https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/ 题目: Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum result of ai XOR aj, where 0 ≤ i, j < n. Could you do this in O(n) runti

Codeforces Round #172 (Div. 2)---D. Maximum Xor Secondary(RMQ + 二分)

Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1,?x2,?-,?xk (k?>?1) is such maximum element xj, that the following inequality holds: . The lucky number of the sequenc