hdu 5969 最大的位或(貪心)
阿新 • • 發佈:2018-12-16
對於一個l和r
我們都看成2進位制
最優情況一定是1000和0111來異或這樣就能得到在位數不可能改變的情況下能夠得到的最大值,
那麼如果l到r能夠存在這種情況就這麼異或
但如果l和r的位數相同,那麼就保留前面相同位數上的0和1,一旦遇到不同則按照以上方法對低位取xxxxx1000和xxxxx0111異或
#include<bits/stdc++.h> using namespace std; int main(){ int t; unsigned long long er[77]; er[0]=1; for(int i=1;i<=63;i++) { er[i]=er[i-1]*2; } cin>>t; while(t--) { unsigned long long l,r; cin>>l>>r; int lz[77]; int lr[77]; int js=0; while(l) { lz[js++]=l%2; l/=2; } int js1=0; while(r) { lr[js1++]=r%2; r/=2; } if(js1!=js) { unsigned long long ans; ans=er[js1]-1; cout<<ans<<endl; } else { unsigned long long ans=0; for(int i=js-1;i>=0;i--) { if(lz[i]==lr[i]) { if(lz[i]==1) ans=ans+er[i]; } else{ unsigned long long tt=er[i+1]-1; ans=ans+tt; break; } } cout<<ans<<endl; } } return 0; }