D. Little Girl and Maximum XOR(贪心)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Little Girl and Maximum XOR(贪心)相关的知识,希望对你有一定的参考价值。
D. Little Girl and Maximum XOR(贪心)
贪心,从最高位开始,显然相同的位 是没有贡献的,因为 [ L , R ] [L,R] [L,R]范围内这些数对应的这些位都相同,我们找到第一个不相同的位 k k k。
显然 R R R的第 k k k位是1, L L L的第 k k k位是0.
那么较大的那个数,我们可以取 10000000 10000000 10000000,且该数肯定 ≤ R \\le R ≤R,因为后面都为0.
较小的数取 01111111111 01111111111 01111111111,该数肯定 ≥ L \\ge L ≥L,因为后面都是1.
答案就是: 2 k + 1 − 1 2^{k+1}-1 2k+1−1。
注意特判 L = R L=R L=R的时候,答案为0.
关于找两个数从高到低第一个不同的位置可以用 ( L ⊕ R ) (L\\oplus R) (L⊕R)
这样最高位的1表示的位置就是 k k k。
然后贡献就是: 2 [ 64 − _ _ b u i l t i n _ c l z l l ( L ⊕ R ) ] − 1 \\large 2^{[64-\\_\\_builtin\\_clzll(L\\oplus R)]}-1 2[64−__builtin_clzll(L⊕R)]−1
c l z clz clz函数是计算前导0的个数, 64 − c l z ( L ⊕ R ) 64-clz(L\\oplus R) 64−clz(L⊕R) 就是 k + 1 k+1 k+1
时间复杂度: l o g ( R ) log(R) log(R)
// Problem: D. Little Girl and Maximum XOR
// Contest: Codeforces - Codeforces Round #169 (Div. 2)
// URL: https://codeforces.ml/contest/276/problem/D
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// Date: 2021-08-11 09:26:23
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
int main(){
ll l,r;scanf("%lld%lld",&l,&r);
printf("%lld\\n",l==r?0:(1LL<<(64-__builtin_clzll(l^r)))-1);
return 0;
}
以上是关于D. Little Girl and Maximum XOR(贪心)的主要内容,如果未能解决你的问题,请参考以下文章
Little Girl and Maximum Sum CodeForces - 276C
CF276E Little Girl and Problem on Trees 题解
Codeforces Round #169 (Div. 2)C. Little Girl and Maximum Sum
C. Little Girl and Maximum Sum差分 / 贪心