牛客网【每日一题】7月31日题目精讲—兔子的区间密码
來源:牛客網
:
文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
有一只可愛的兔子被困在了密室了,密室里有兩個數字,還有一行字:
只有解開密碼,才能夠出去。
可愛的兔子摸索了好久,發現密室里的兩個數字是表示的是一個區間[L,R]
而密碼是這個區間中任意選擇兩個(可以相同的)整數后異或的最大值。
比如給了區間[2,5] 那么就有2 3 4 5這些數,其中 2 xor 5=7最大 所以密碼就是7。
兔子立馬解開了密室的門,發現門外還是一個門,而且數字越來越大,兔子沒有辦法了,所以來求助你。
提示:異或指在二進制下一位位比較,相同則 0 不同則 1
例如2=(010) 2 5=(101)2
所以2 xor 5=(111)2=7
輸入描述:
第一行一個數 T,表示數據組數。
接下來 T 行,每行兩個數 L,R, 表示區間[L,R]。
輸出描述:
輸出共T行每行一個整數,表示[L,R]的密碼。
示例1
輸入
復制
輸出
復制
備注:
對于30%的數據
1 ≤ T ≤ 10
0 ≤ L ≤ R ≤ 100
對于另外10%的數據
L=R
對于70%的數據
1 ≤ T ≤ 10
0 ≤ L ≤ R ≤ 50000
對于100%的數據
1 ≤ T ≤ 10000
0 ≤ L ≤ R ≤ 1018
(對于100%的數據) 輸入數據較大,請使用快速讀入。
題解:
不同異或為1
要使得兩個數異或后的結果最大,二進制狀態下就要從高位開始就盡量大,也就是兩個數從高位起盡可能不相同
當L = = R時,return 0
當L<R時,看L和R最高二進制位是否相等
如果相等在L~R之間的數這一位都是一樣的,不會對答案有影響,繼續往后推看下一位。
如果不相等,R的這一位一定是1,L的這一位肯定是0,從這一位往后我們就可以根據R的情況來決定另一個要與R異或的數(我們稱這個數為x),從這一位開始,x的之后每一位可以任取,x一定大于等于L,那么之后取得數都可以實現互補(一個取0,一個取1),異或出來都是1
假設最高是2 i ,我們就可以選取2 i和2 i-1這兩個數去異或得到的答案就是2 i+1-1
所以答案就是L和R二進制不相同的最高位開始之后都是1,就是答案
求一次是O(log n)
代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; int size[maxn]; int a[maxn],sum; vector<int>g[maxn]; typedef long long ll; int n; inline ll read() {ll f=1,x=0;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar(); }return f*x;} int main() {ll t;t=read();while(t--){ll l=read(),r=read();int i;for(i=63;i>=0;i--){if((l>>i)!=r>>i)break;}cout<<(1ll<<i+1)-1<<endl;}return 0; }總結
以上是生活随笔為你收集整理的牛客网【每日一题】7月31日题目精讲—兔子的区间密码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10系统重装不含gho文件的原版镜
- 下一篇: 牛客网 【每日一题】8月5日题目精讲—蓝